数据库查缺补漏
Mysql的EXPLAIN应该重点关注哪些字段?
- type.访问类型
1.1. const.通过主键索引/唯一非空索引。整张查询只匹配一行常量数据,单表查询为主
1.2. eq_ref.通过主键索引/唯一非空索引。多表关联join时,驱动表每一行,精确匹配被连接表的唯一一行
1.3. ref.普通索引等值匹配,匹配多行
1.4. range.索引范围查询(between/>/</in)
1.5. index.全索引扫描
1.6. ALL.全表扫描,最差,必须避免 - possible_keys.候选索引,不一定真的用上
- key_len.使用索引字段占用字节长度,可判断是否用到联合索引全部字段
- rows.预计需要扫描的行数
- Extra(额外关键信息,重点关注)
5.1. Using index。覆盖索引
5.2. Using index condition。索引条件下推
5.3. Using where。服务器层在获取数据后,额外做 WHERE 条件过滤
5.4. Using join buffer。没有合适索引做表连接,MySQL 使用连接缓冲区(内存)来匹配关联行
5.5. Using filesort。创建临时表(内存 / 磁盘临时表)来处理 GROUP BY / DISTINCT / UNION / 子查询等操作,开销很大
5.6. Using temporary。创建临时表(内存 / 磁盘临时表)来处理 GROUP BY / DISTINCT / UNION / 子查询等操作,开销很大
UNION和UNION ALL的区别?
| 对比项 | UNION | UNION ALL |
|---|---|---|
| 去重逻辑 | 自动去除重复行 | 保留全部原始数据,不去重 |
| 排序行为 | 合并后做排序 | 直接按原始顺序拼接,不额外排序 |
| 底层开销 | 高(会产生临时表、额外排序运算) | 开销很小,无额外去重/排序操作 |
| 性能 | 较慢 | 速度更快,日常优先使用 |
| 使用场景 | 需要整体去重的场景 | 确认无重复数据、追求查询性能 |
原创
sql调优查缺补漏
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法