#夏日挑战赛#后端再进阶一步,MySQL 优化学习第1天 原创

发布于 2022-7-13 14:58
浏览
3收藏

「本文正在参加星光计划3.0–夏日挑战赛」

任何一个后端工程师,都离不开数据库操作,而数据库中 MySQL 又是使用频率最高的一款,所以本系列专栏,将以3天一篇的频率,一起学习 MySQL 优化。

单表优化

从字段上,尽量使用 tinyintsmallintmediumint 作为整数类型,而不是用 int ,如果存储的值非负的话,再使用 UNSIGNED

  • tinyint:占用1字节的存储空间,即8位(bit),取值范围 -127~127,在建表的时候要注意 tinyint(3) 可以,但是 tinyint(100) 还是 3 位,无符号范围是 0255
  • smallint:占用2字节,无符号范围 -32,76832,767 ,无符号的范围是 065,535
  • mediumint:占用3字节,无符号的范围是 016,777,215 ,带符号的范围是 -8,388,6088,388,607
  • int最常用的,占用4字节,无符号的范围是 04,294,967,295,带符号的范围是从 -2,147,483,6482,147,483,647
  • bigint:占用 8 个字节,范围很大!

这些数字只需要记住大概范围即可。

MySQL逻辑架构

MySQL逻辑架构可按照三层区分:

  • 客户端层:建立链接部分,例如 Navicat 软件建立链接;
  • 核心服务层:查询解析、分析、优化、缓存等都在这一层,存储过程,触发器,视图也在这一层;
  • 存储引擎层:负责MySQL中的数据存储和提取。

在这里翻阅资料的时候,碰到了一个新的概念,通信协议中的半双工机制,与之对应的有 单工通信半双工全双工

每个概念都可以进行简单的理解,例如:

  • 全双工机制:双向同时进行,例如上传数据的同时还能下载数据;
  • 单工通信:只能一方向另一方通信;
  • 半双工机制:同一时刻只能一方向另一方通讯,MySQL客户端/服务端通信协议是半双工的,也就是在一瞬间,不是服务器向客户端发数据,就是客户端向服务器发数据,在发送的时候中间没有办法切断

基于这种机制,会出现如下场景,如果从客户端发送的数据包太大了,可能导致请求超时,反之服务器发送的数据过大,传输时间也会变长,所以我们要控制服务器(MySQL)给我们返回的数据,尽量避免使用 select * ,尽量加上 limit 限制返回条数。

这种操作的核心逻辑是降低通信数据包的大小和数量

存储引擎层

今天咱们一起学习的最后一部分是MySQL存储引擎层。

目前接触最多的是 MyISAM 和 InnoDB 两种引擎,可以针对单表进行设置。

 #夏日挑战赛#后端再进阶一步,MySQL 优化学习第1天-开源基础软件社区

MyISAM

MyISAM 引擎是 MySQL 5.1 及之前版本的默认引擎,有如下内容:

  • 不支持事务,不支持外键,是表锁,支持全文索引;
  • 不支持安全恢复;
  • 在表有读取查询的同时,支持往表中插入新纪录;
  • 存储引擎表由MYD,MYI组成,MYD用来存放数据,MYI存索引;
  • 支持压缩表(该表不会被修改,例如枚举表),大幅度减少磁盘空间占用,可以 myisampack 工具。

InnoDB

InnoDB 在 MySQL 5.5 后成为默认引擎,它的特点是:

  • 支持事务,外键,支持行锁,支持高并发;
  • 支持安全恢复;
  • MySQL 5.6 已支持全文索引。

其它差别

InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描,当然如果加了 where 语句 ,二者差异不大。
MyISAM 用一个变量保存了整个表的行数,所以上述语句的执行速度很快;
InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。正是因为这个原因,一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。

基于上述内容,如果执行大量的SELECT,选择 MyISAM,如文章表;如果执行大量的 INSERT或UPDATE ,优先选择 InnoDB 表,如订单表。

然后在翻阅资料的时候,又发现一句总结:没啥特殊的话请使用 InnoDB ,瞬间简洁了~~

记录时间

今天是持续写作的第 282 / 365 天。
可以关注我,点赞我、评论我、收藏啦。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
7
收藏 3
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐