MySQL 性能优化・诗意化记忆

覆盖索引、explain、SQL、表设计、锁、配置,古风短句,面试背诵向

总起

库中万绪藏千行,慢索翻寻耗时光。 优化不从一处取,表、索、SQL、锁与章。

一、表结构设计优化

plaintext

复制代码
建表先把范式量,适度冗余莫过僵。
字段类型宜精简,大文本莫入寻常。
非空约束勤加设,默认值补空位荒。
主键自增为上策,乱序索引裂篇章。
分库分表逢海量,冷热数据两厢藏。

记忆点:

  • 适度反范式,不要死磕三范式
  • 小类型优先,char/varchar 选对,blob/text 尽量移出主表
  • 主键尽量自增,无序主键会造成索引页分裂
  • 大数据量考虑分库分表、冷热分离

二、索引核心(重中之重)

plaintext

复制代码
索引如书目录章,快寻记录少奔忙。
B+树聚簇存主引,二级索引携键行。
最左匹配须恪守,失效条件记端详。
like%前通索引废,隐式转换路即亡。
or无引全表扫,函数运算引无光。
冗余索引当清理,独一索引防乱章。
并非多索引便好,写增开销暗自伤。

记忆点索引失效场景:

  1. like 以 % 开头
  2. 索引列做函数、运算
  3. 隐式类型转换
  4. or 条件一侧无索引
  5. 违背最左前缀原则

聚簇索引:数据就在索引叶子;二级索引存主键,回表拿数据。 覆盖索引:查询字段全在索引,免回表,性能大提升。

覆盖索引

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 建索引; 锁勿久持有,缓冲池要够,慢查把祸找

相关推荐
刘胡子大叔20 小时前
MySQL 升到 8.4 前的兼容性自检清单
mysql
IT古董20 小时前
《FDE前沿部署工程师实战教程》33 - Enterprise AI Observability:从Agent Trace到全链路智能运维
数据库·人工智能
for_ever_love__20 小时前
MySQL 主从复制讲透:binlog 原理、搭建步骤与读写分离
java·数据库·mysql·binlog·读写分离·原理·主从复制
Nturmoils1 天前
GROUP BY 先别想当然,查汇总前把规则跑清楚
数据库
最笨的羊羊1 天前
Oceanbase数据库系列之:向量数据库核心知识
数据库·oceanbase
fish_xk1 天前
mysql中的表的约束
数据库·mysql
谢亮_vipxieliang1 天前
Go Channel 高级模式——从底层原理到扇出扇入实战
java·数据库·golang
ggaofeng1 天前
自己编写邮件服务器和客户端
数据库
打工仔折腾 AI1 天前
Docker镜像分层与卷挂载到底怎么工作:一次文件系统层面的实测分析
运维·人工智能·后端·python·docker·容器·性能优化
java1234_小锋1 天前
【技术专题】Mysql8 数据库 - Mysql8 添加,更新,删除数据
数据库·mysql