- A+
索引有很多类型,可以为不同的场景提供更好的性能。在 MySQL 中,索引是存储在引擎层而不是服务器层实现的。所以,并没有统一的索引标准:不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持支持所有类型的的索引。
B - Tree 索引
如果没有特指所有类型,一般来说,指的 B - Tree 类型,它使用 B - Tree 数据结构来存储数据。
存储引擎以不同的方式使用 B - Tree 索引,性能也各有不同,各有优劣。例如,MyISAM 使用前缀压缩技术使得索引更小,但 InnoDB 则按照原数据格式进行存储。再如 MyISAM 索引通过数据的物理位置引用被索引的行,而 InnoDB 则根据主键引用被索引的行。
B - Tree 通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同。
B - Tree 索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查询的值可以找到合适的指针进入下层节点,这些指针实际上定义了子节点页中值的上限和下限。最终存储引擎要么找到对应的值,要么该记录不存在。
叶子节点比较特别,它们的指针指向的是被索引的数据,而不是其他的节点页。树的深度和表的大小直接相关。
B - Tree 对索引列是顺序组织出场的,所以很适合查找数据范围。例如,在一个基于文本域的索引树上,按字母顺序传递连续的值进行查找是非常合适的。
需要注意的是,索引对多个值进行排序的依据是 CREATE TABLE 语句中定义索引时列的顺序。
可以使用 B - Tree 索引的查询类型。B - Tree 索引适用于全键值、键值范围和键前缀查找。其中键前缀查找只适用于根据最左前缀的查找。前面所述的索引对如下类型的查询有效。
全值匹配
全值匹配指的是和索引中的所有列进行匹配。
匹配最左前缀
匹配列前缀
也可以只匹配某一列的值的开头部分。
匹配范围值
精确匹配某一列并范围匹配另外一列
只访问索引的查询
因为索引树中的节点是有序的,所以除了按值查找之外,索引还可以用于查询中的 ORDER BY 操作。一般来说,如果 B - Tree 可以按照某种方式查找到值,那么也可以按照这种方式进行排序。所以,如果 ORDER BY 子句满足前面的几种查询类型,那么这个索引也可以满足对应的排序需求。
下面是一些关于 B - Tree 索引的限制:
如果不是安装索引的最左列开始查找,则无法使用索引。
不能跳过索引中的列。
如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。
总之,这些限制都和索引列的顺序有关。在优化性能时,可能需要使用相同的列但顺序不同的索引来满足不同类型的查询需求。