MySQL查询优化器的局限性
- 关联子查询
MySQL的关联子查询实现的很差,最好改成左外连接(LEFT OUTER JOIN)
- UNION的限制
UNION查询的数据会放到临时表中,所以无法使用索引优化,最好是在每个子查询中带上查询条件
- 松散索引扫描(跳跃索引扫描skip index scan)
比如有索引(a,b),where b between 2 and 4,因为索引是有序的,在a相同的情况下,按照顺序取b的数据,不需要where子句过滤(MySQL目前不支持)
- 最大值和最小值的优化
如果聚合的列不是索引列,那将会全表扫描
- 在同一个表上查询和更新
不要使用子查询,改用INNER JOIN
优化特定类型的查询
- COUNT()的作用
- 统计行数 2.统计列值的数量
如果是统计行数的话,最好用COUNT(*)
优化:使用近似值、汇总表
- 优化关联查询
确保ON或者USING子句中的列上有索引
确保任何的GROUP BY和ORDER BY中的表达式都来自同一个表
- 优化子查询
尽可能使用关联查询代替
- 优化GROUP BY和DISTINCT
尽可能采用标识列分组
- 优化LIMIT分页
尽可能使用覆盖索引,先从索引中取到具体分页主键,再关联查询出具体行的数据
- 优化UNION查询
MySQL总是通过创建并填充临时表的方式来执行UNION查询
优化:在每个子查询中带上查询条件
如果不是必须要消除重复行,那就使用UNION ALL
网友评论