MySQL索引介绍

98 阅读2分钟

MySQL性能优化

索引类型

B-tree索引:很多存储引擎使用的都是B+树,B+树是B树的一种变形形式,B+树上的叶子结点都包含指向下一个叶子结点的指针,从而方便遍历叶子节点的范围。
- 全值匹配
- 匹配最左前缀
- 匹配列前缀
- 匹配范围值
- 精确匹配某一列并范围匹配另外一列
- 只访问索引的查询

自适应哈希索引:当InnoDB发现某些索引值被频繁访问时,它会在原有的B-tree索引上,在内存中再构建一个哈希索引

全文索引

它查找的是文本中的关键词,而不是直接比较索引中的值。全文索引适用于MATCH AGAINST操作,而不是普通的WHERE条件操作。

使用索引的优点

— 索引大大减少了服务器需要扫描的数据量
- 索引可以帮助服务器避免排序和临时表
- 索引可以将随机I/O变为顺序I/O

高性能的索引策略

前缀索引:BLOB、TEXT和长VARCHAR类型的列,必须使用前缀索引,因为mysql不支持对这些列的完整内容进行索引。(前缀索引无法做order by和group by操作,也无法使用前缀索引做覆盖扫描)

索引基数:索引基数是数据列所包含的不同值的数量。MySQL 中,基数可以通过“show index from tableName”查看。

索引选择性 = 索引基数/数据总数。索引的可选择性好与坏,和索引基数关系非常密切。基数值越高,索引的可选择性越好;相反,基数越低,索引的可选择性越差。

多列索引

在多列上独立的创建多个单列索引,在大部分情况下并不能提高mysql的查询性能,Mysql引入了“索引合并”的策略,它在一定条件下可以使用多个单列索引来定位指定的行。在这种情况下查询能够同时使用两个单列索引进行扫描,并将结果进行合并。这种算法有三个变种:OR条件的联合,AND条件的相交,联合和相交。 通过查看explain 的extra可以看到算法的使用。

选择合适的索引顺序

当不需要考虑排序和分组的时候,将选择性最高的列放在前面是一个好的选择,但是性能不能只依赖索引的选择性,也和查询条件的具体值有关。