mysql性能优化系列(二) ---认识一下mysql的索引

B-Tree 索引

B-Tree索引是用B-Tree数据结构来存储数据的。大多数mysql引擎都支持这种索引,也是用的比较多的一种它每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。

为什么B-Tree索引能加快访问的速度?

因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。根节点的槽中存放指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查找的值,可以找到合适的指针进入下层子节点。

什么时候用B-Tree索引

B-Tree索引适用于全键值、键值范围或者键前缀查找。其中键前缀查找只适用于最左前缀的查找。因为B-Tree是顺序组织存储的,所以很适合查找范围数据。它对以下类型有效:

1. 全值匹配

全值匹配指的是和索引中所有列进行匹配,比如name 和 age 都有索引,查询name=xxx and age=xx的记录。

2. 匹配最左前缀的查询

只能匹配索引的第一列,如联合索引,只有左边的有效。

3. 匹配列前缀

只匹配某一列的值得开头部分,例如查找所有以A开头的名字的人。

4. 匹配范围值

查询 价格 1-1000之间的值。

5. 精确匹配左前列并范围匹配另外一列

就是查找名称为A的人,并且名字开头是B的。即第一列全匹配,第二列范围匹配。

6、只访问索引的查询

btree索引使用限制

1、只能按照索引的最左列开始查找。
2、如果查询中有某个列的范围查询,则其右边所有列都无法使用索引。就是 like 后面的列全部无法使用索引
3、不能跳过索引中的列。也就是说不能查询名称为A 并且年龄为B的数据。

哈希索引

哈希索引基于哈希表实现,只有,只有精确匹配索引所有列的查询才有效,对于每一行数据存储引擎都会对所有的索引列计算一个哈希码。在MySQL中,只有Memory引擎显示的支持哈希索引。因为哈希索引自身只需存储对应的哈希值。所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。然而哈希索引也有的限制。

1. 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。
2. 哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。
3. 哈希索引也不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。
4. 哈希索引只支持等值比较查询。
5. 如果哈希冲突很多的话,一些索引维护操作的代价会很高。

因为这些限制,哈希索引只适用于某些特定的场合,而一旦适合哈希索引,则它带来的性能提升将非常显著。

还有一些空间数据索引、全文索引就不多做概述。

你可能感兴趣的:(mysql)