节选自《MySQL性能调优与架构设计》一书。
如何判定是否需要创建索引
- 较为频繁的作为查询条件的字段应该创建索引;
- 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;(唯一性太差的字段主要是指哪些呢?如状态字段,类型字段等等这些字段中的数据可能总共就是那么几个几十个数值重复使用)(当一条Query所返回的数据超过了全表的15%的时候,就不应该再使用索引扫描来完成这个Query了)
- 更新非常频繁的字段不适合创建索引;(因为索引中的字段被更新的时候,不仅仅需要更新表中的数据,同时还要更新索引数据,以确保索引信息是准确的)
- 不会出现在WHERE子句中的字段不该创建索引;
对于选择合适索引的几点建议
- 对于单键索引,尽量选择针对当前Query过滤性更好的索引;
- 在选择组合索引的时候,当前Query中过滤性最好的字段在索引字段顺序中排列越靠前越好;
- 在选择组合索引的时候,尽量选择可以能够包含当前Query的WHERE子句中更多字段的索引;
- 尽可能通过分析统计信息和调整Query的写法来达到选择合适索引的目的而减少通过使用Hint认为控制索引的选择;
MySQL中索引的限制
- MyISAM存储引擎索引键长度总和不能超过1000字节;
2 BLOB和TEXT类型的列只能创建前缀索引; - MySQL目前不支持函数索引;
- 使用不等于的时候MySQL无法使用索引;
- 过滤字段使用了函数运算后,MySQL无法使用索引;
- Join语句中Join条件字段类型不一致的时候MySQL无法使用索引;
- 使用LIKE操作的时候如果条件以通配符开始MySQL无法使用索引;
- 使用非等值查询的时候MySQL无法使用Hash索引。