SQL 调优本质上就一句话:
减少 MySQL 扫描的数据量,减少排序、临时表和回表,让数据库用尽可能低的成本拿到结果。
更具体地说:
c
全表扫描慢,是因为读的数据太多
索引快,是因为 B+ 树可以快速定位范围
复合索引快,是因为它可以同时服务过滤和排序
覆盖索引快,是因为减少了回表
深分页慢,是因为扫描并丢弃了大量数据
函数、前置模糊匹配慢,是因为破坏了索引的有序性
sql执行过程
sql
SELECT id, username
FROM t_user
WHERE create_time < '2025-01-01 12:00:00'
AND status = 1
ORDER BY age ASC;
当进行sql扫描的时候,SQL会收集需要的字段,并不是把一行数据全都加到暂存区
读取:从 InnoDB 数据页里把记录读出来
暂存:MySQL 为了排序、分组、返回结果临时保存一些字段
InnoDB:把一行记录读出来给 MySQL
MySQL:判断 WHERE
MySQL:只把后面要排序/返回的字段放进临时结构
需要的字段
sql
status
age
create_time
id
username