Mysql原理浅析——高性能索引策略
如何高效使用索引:
独立的列
在表达式中使用索引的列不能是表达式的一部分,也不能是函数的参数。
如 … where id+1 = 5; 索引会失效。
前缀索引和索引的选择性
有时候需要索引很长的字符列,这会导致索引变得大且慢,此时除了可以使用伪hash索引(即使用CRC32函数取得其冗余校验码保存)还可以使用前缀索引,即创建索引时只截取固定字符作为索引。
这样虽然可以节省空间但也降低了索引的选择性,需要我们通过尝试找到那个对索引选择性影响最小的前缀长度。可以使用 count(DISTINCT column) / count( * )获得完整列的索引选择性,再通过count(DISTINCT LEFT(7)) / count( * )获得前缀索引的选择性。
多列索引
为每个列建立索引是不明智的,并不能提高Mysql的查询性能。Mysql5.0和更新的版本提供了“索引合并”策略,即查询语句中有多个单列索引时会同时采用最多两个这些单列索引进行扫描,最后进行合并(or,and)。
选择合适的索引列顺序
通常认为将选择性最高的列放到联合索引的最前列是有助于提高索引效率的。
覆盖索引
如果索引的叶子节点包含了要查询的数据,就省略了一次回表查询的操作。即如果一个索引包含要查询的所有数据,就称之为覆盖索引。设计时可以使用覆盖索引来减少回表查询的次数。
使用索引扫描来做覆盖
使用索引对结果排序的条件
(1)联合索引列的顺序必须与order by子句顺序一致。
(2)所有列的排序方式必须一样(正序或倒叙)。