覆盖索引、explain、SQL、表设计、锁、配置,古风短句,面试背诵向
总起
库中万绪藏千行,慢索翻寻耗时光。 优化不从一处取,表、索、SQL、锁与章。
一、表结构设计优化
plaintext
建表先把范式量,适度冗余莫过僵。
字段类型宜精简,大文本莫入寻常。
非空约束勤加设,默认值补空位荒。
主键自增为上策,乱序索引裂篇章。
分库分表逢海量,冷热数据两厢藏。
记忆点:
- 适度反范式,不要死磕三范式
- 小类型优先,char/varchar 选对,blob/text 尽量移出主表
- 主键尽量自增,无序主键会造成索引页分裂
- 大数据量考虑分库分表、冷热分离
二、索引核心(重中之重)
plaintext
索引如书目录章,快寻记录少奔忙。
B+树聚簇存主引,二级索引携键行。
最左匹配须恪守,失效条件记端详。
like%前通索引废,隐式转换路即亡。
or无引全表扫,函数运算引无光。
冗余索引当清理,独一索引防乱章。
并非多索引便好,写增开销暗自伤。
记忆点索引失效场景:
- like 以 % 开头
- 索引列做函数、运算
- 隐式类型转换
- or 条件一侧无索引
- 违背最左前缀原则
聚簇索引:数据就在索引叶子;二级索引存主键,回表拿数据。 覆盖索引:查询字段全在索引,免回表,性能大提升。
覆盖索引
plaintext
查询字段索引藏,不必回表访本行。
少读磁盘少耗费,覆盖索引是良方。
三、explain 执行计划
plaintext
Explain览行路方,type列里辨短长。
system const优为上,eq_ref ref次第扬。
range仅扫区间内,index遍历索引章。
all全表全盘扫,此景出现要提防。
Extra字段细端详,using filesort排序伤。
using temporary建临时,两害相逢性能僵。
using index覆盖好,using where条件量。
type 优先级:system > const > eq_ref > ref > range > index > ALL
- ALL:全表扫描,尽量消灭
- Using filesort:文件排序,消耗大
- Using temporary:临时表,多出现 group by、union
四、SQL 语句优化
plaintext
select莫用星号扬,按需取列减行囊。
where早筛缩数据集,join少连表数行。
limit深翻慎偏移,分页大坑要提防。
in集过大性能降,exists斟酌两相量。
避免大事务久悬置,锁占长时祸祸殃。
join关联建索引,笛卡尔积切莫尝。
要点:
- 禁止
select * - 大 offset 分页不要直接 limit offset,size
- in 集合不要过大
- join 关联字段务必建索引,控制 join 表数量
- 大事务拆分,事务尽量小而短
五、锁与事务优化
plaintext
行锁粒度细如芒,表锁横扫满仓伤。
意向锁辅行表判,间隙锁防幻读殃。
事务简短速提交,久持锁柄众争忙。
隔离级别慎调高,RC多数业务彰。
RC 读已提交,大部分业务使用;RR 可防幻读,但有间隙锁,容易死锁。 事务越长,持有锁时间越久,冲突、死锁概率飙升。
六、配置层面优化
plaintext
缓冲池是核心仓,innodb_buffer_pool_size。
内存大半归此用,热数据驻内存疆。
日志刷盘调参数,平衡性能与安康。
慢查询日志开启,捕获慢SQL的祸殃。
重点:innodb_buffer_pool_size,一般设置服务器物理内存 50%‑70%,缓存索引 + 数据页,减少磁盘 IO。
完整七言背诵诗
plaintext
建表权衡范式章,字段精简忌铺张。
自增主键防分裂,大字段要避主行。
B加树作目录章,最左匹配不可忘。
前通like隐转换,函数运算索引亡。
覆盖索引免回表,多引徒增写耗伤。
Explain看type行,ALL全扫要提防。
filesort与临时表,Extra见此细思量。
SQL勿用星号扬,where筛减数据量。
分页深移需巧计,大in慎用细权衡。
join字段建索引,大事务要速收场。
行锁细粒度为上,长持锁柄起争攘。
缓冲池内存多予,慢志捕得劣SQL。
调优本是权衡术,没有灵丹万事昌。
极简面试口诀
表要简,键要增; 索引善,忌失效;覆盖免回表; explain 看 type,拒 ALL,避临时排序; SQL 少星号,事务短,join 建索引; 锁勿久持有,缓冲池要够,慢查把祸找