高性能 MySQL 驾驶笔记
聊天群里看到有人复习 MySQL 准备面试,想起之前整理过《高性能MySQL》的笔记,倒是很适合面试前的准备
内容大部分是整理自《高性能MySQL》第三版,外加少量的个人经验
Schema Tips:
Varchar 存储时会自动调整长度
MySQL 会根据 Varchar 指定的长度预分配空间,所以用尽量小的值效率会更好
Varchar 长度变大时会造成碎片和性能问题,MySQL 需要重新为其分配空间
文本类型数据可以考虑是否使用 Binary,性能会比文本好
关联键用 int 效率最高
主键小的话表也会小,所以用 int 做主键可以提升性能。可以考虑内部 int, uuid 外部的“双主键”设计
TimeStamp 效率更高,4 个字节,带时区信息,储存为 unix time 默认不为 NULL。DateTime 则无限制,用数字存储,时间支持到 9999 年,效率不如 TimeStamp
IP 应该使用整数存储,使用 MySQL 函数互相转换
Columns 过多会引发性能问题,因为 MySQL 服务层会负责转换引擎层的数据
索引:
一般使用 B+Tree,可以控制在 log 时间内
单列索引性能提升有限,Mysql 使用多个单独索引会分别查询后合并,并不一定能够节省时间。
索引可以用来用作排序,读索引的值,非常高效
text 和长 varchar 只会使用前 N 个长度来索引,无法用索引排序
小技巧,可以使用“索引”字段加索引,达到人工控制索引的目的
聚簇索引,使用 B+Tree,在 innodb 中就是表,使用自增列会得到很好的 IO 性能(有序,连续),使用 UUID 则效率低下(随机 IO,要写 Tree 的不同位置),所以主键要使用自增 int
因为底层存储引擎 API 限制,Like 操作不能直接读索引返回
增加索引会提升查询速度,但会降低增删改操作,所以也可以考虑用缓存解决
InnoDB ID 自动包含在二级索引