B-Tree索引
索引在存储引擎层,不同存储引擎索引工作方式不一样。InnoDB引擎最常使用的是B-Tree索引,实际上是B+Tree数据结构,其相较于B-Tree结构不同的是,B+Tree每个叶子节点都包含一个指向下一个叶子节点的指针。MyISAM使用前缀压缩技术使得索引更小,并使用数据的物理位置引用被索引的行;InnoDB按照原数据格式存储索引的列值,并根据主键引用被索引的行。如果索引列包含order by子句中列,且列顺序一致,则该索引可以用于排序。
可以使用B-Tree索引的查询类型
- 全值匹配
- 匹配最左前缀列
- 匹配列前缀
- 匹配范围值
- 精确匹配某一列并范围匹配另一列
- 只访问索引的查询(覆盖索引)
B-Tree索引的限制
- 如果不是按照索引的最左列开始查找,则无法使用索引
- 不能跳过索引中的列
- 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引
索引的优点
- 减小了服务器需要扫描的数据量
- 帮助服务器避免排序和临时表
- 索引可以将随机I/O变为顺序I/O
高性能的索引策略
独立的列
独立的列是指索引列不能是表达式的一部分,也不能是函数的参数
前缀索引和索引选择性
如果索引列是很长的字符列,则索引会变得大且慢。可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。但是这样会降低索引的选择性,索引的选择性是指,不重复的索引值和数据表的记录总数的比值。索引的选择性越高则查询效率越高,因为选择性高的索引可以在查找时过滤掉更多的行。