- 对于非覆盖索引,全表扫描和基于全索引扫描的执行计划之间的区别基本上是顺序读取和随机读取之间的差异:如果具有快速存储,它可能会很接近,如果存储速度慢,性能差异可能会很大。
- 当您尝试不同的执行计划时,请不要忘记衡量响应时间。专注于拥有漂亮的执行程序太容易了,但是最终用户只关心响应时间
优化器的局限性:它不知道数据存储在哪种媒介的硬盘上。如果将其存储在传统的旋转机械磁盘上,则认为随机读取比顺序读取要慢得多的假设是正确的,但是如果数据存储在SSD中,情况就不再如此。这就是为什么当执行计划看起来相似时,您应该始终执行查询以真正查看应该选择哪个执行计划。
强制索引扫描的例子
EXPLAIN SELECT * FROM employees FORCE INDEX(idx_first) ORDER BY firstname
数据扫描方式
全表扫描
扫描整个表数据,IO开销大,速度慢,锁等严重,影响MySQL的并发。
对于OLAP的业务场景,需要扫描返回大量数据,这时候全表扫描的顺序IO效率更高,全表扫描是顺序IO。
索引扫描
索引通常比表小,扫描的数据量小,消耗的IO少,执行速度块,能够提高MySQL的并发,索引扫描是随机IO。
表的索引设计
复合索引
- 将过滤范围大的放在复合索引的前面
- 将等值查询的列放在复合索引的前面(比如状态列),将范围查询的列放在复合索引的最后面(比如时间列)