第六章 查询性能优化(下)

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()的作用
  1. 统计行数 2.统计列值的数量
    如果是统计行数的话,最好用COUNT(*)
    优化:使用近似值、汇总表
  • 优化关联查询

确保ON或者USING子句中的列上有索引
确保任何的GROUP BY和ORDER BY中的表达式都来自同一个表

  • 优化子查询

尽可能使用关联查询代替

  • 优化GROUP BY和DISTINCT

尽可能采用标识列分组

  • 优化LIMIT分页

尽可能使用覆盖索引,先从索引中取到具体分页主键,再关联查询出具体行的数据

  • 优化UNION查询

MySQL总是通过创建并填充临时表的方式来执行UNION查询
优化:在每个子查询中带上查询条件
如果不是必须要消除重复行,那就使用UNION ALL

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容