#夏日挑战赛#后端再进阶一步,MySQL 优化学习第1天 原创
任何一个后端工程师,都离不开数据库操作,而数据库中 MySQL 又是使用频率最高的一款,所以本系列专栏,将以3天一篇的频率,一起学习 MySQL 优化。
单表优化
从字段上,尽量使用 tinyint
, smallint
, mediumint
作为整数类型,而不是用 int
,如果存储的值非负的话,再使用 UNSIGNED
。
tinyint
:占用1字节的存储空间,即8位(bit),取值范围-127~127
,在建表的时候要注意tinyint(3)
可以,但是tinyint(100)
还是 3 位,无符号范围是0
到255
;smallint
:占用2字节,无符号范围-32,768
到32,767
,无符号的范围是0
到65,535
;mediumint
:占用3字节,无符号的范围是0
到16,777,215
,带符号的范围是-8,388,608
到8,388,607
;int
:最常用的,占用4字节,无符号的范围是0
到4,294,967,295
,带符号的范围是从-2,147,483,648
到2,147,483,647
;bigint
:占用 8 个字节,范围很大!
这些数字只需要记住大概范围即可。
MySQL逻辑架构
MySQL逻辑架构可按照三层区分:
- 客户端层:建立链接部分,例如
Navicat
软件建立链接; - 核心服务层:查询解析、分析、优化、缓存等都在这一层,存储过程,触发器,视图也在这一层;
- 存储引擎层:负责MySQL中的数据存储和提取。
在这里翻阅资料的时候,碰到了一个新的概念,通信协议中的半双工机制,与之对应的有 单工通信,半双工,全双工。
每个概念都可以进行简单的理解,例如:
- 全双工机制:双向同时进行,例如上传数据的同时还能下载数据;
- 单工通信:只能一方向另一方通信;
- 半双工机制:同一时刻只能一方向另一方通讯,MySQL客户端/服务端通信协议是半双工的,也就是在一瞬间,不是服务器向客户端发数据,就是客户端向服务器发数据,在发送的时候中间没有办法切断
基于这种机制,会出现如下场景,如果从客户端发送的数据包太大了,可能导致请求超时,反之服务器发送的数据过大,传输时间也会变长,所以我们要控制服务器(MySQL)给我们返回的数据,尽量避免使用 select *
,尽量加上 limit
限制返回条数。
这种操作的核心逻辑是降低通信数据包的大小和数量。
存储引擎层
今天咱们一起学习的最后一部分是MySQL存储引擎层。
目前接触最多的是 MyISAM 和 InnoDB 两种引擎,可以针对单表进行设置。
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 天。
可以关注我,点赞我、评论我、收藏啦。
感谢擦姐,群里来的,已经学习
MySQL 优化 赞赞赞