MySQL SQL 优化
前言
有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧。
注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引
知识为基础。
优化目标
1.减少 IO 次数
IO 永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中
超过 90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,
也是收效最明显的优化手段。
2.降低 CPU 计算
除了 IO 瓶颈之外,SQL 优化中需要考虑的就是 CPU 运算量的优化了。order by, group
by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。
当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标
优化方法
改变 SQL 执行计划
明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上
述 2 个目标的方法其实只有一个,那就是改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通
过各种“捷径”来找到我们需要的数据,以达到 “减少 IO 次数” 和 “降低 CPU 计算” 的目标
常见误区
1.count(1)和 count(primary_key) 优于 count(*)
很多人为了统计记录条数,就使用 count(1) 和 count(primary_key) 而不是 count(*)
,他们认为这样性能更好,其实这是一个误区。对于有些场景,这样做可能性能会更差,应为
数据库对 count(*) 计数操作做了一些特别的优化。
2.count(column) 和 count(*) 是一样的