学软件技术,读第一手资料,去官方网站:MySQL 5.7参考手册
也可以看看比较经典的书籍,如《高性能MySQL》等
1、索引的概念(快速找到记录的一种数据结构)
索引(在MySQL中也叫做“键(key)") 是存储引擎用于快速找到记录的一种数据结构。
mysql> SELECT first_ name FROM sakila.actor WHERE actor_ id = 5;
如果在actor_ id列上建有索引,则MySQL将使用该索引找到actor_ id为5的行,也就是说,MySQL先在索引上按值进行查找,然后返回所有包含该值的数据行。索引可以包含一个或多个列的值。如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列。在MySQl中,索引是存储引擎层而不是服务层实现的。
2、B+Tree(每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历),InnoDB使用的是B+Tree
实际上很多存储引擎使用的是B+Tree,即每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。
InnoDB根据主键引用被索引的行。
B+Tree通常意味着所有的值是按照顺序存储的。并且每一个叶子页到跟的距离相同。下图展示了B+Tree索引的抽象表示,大致反映偶尔InnoDB索引是如何工作的。
B+Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点(图示并未画出)开始进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进人下层子节点,这些指针实际上定义了子节点页中值的上限和下限。最终存储引擎要么是找到对应的值,要么该记录不存在。
叶子节点比较特别,它们的指针指向的是被索引的数据,而不是其他的节点页(不同引擎的“指针”类型不同)。图中仅绘制了一个节点和其对应的叶子节点,其实在根节点和叶子节点之间可能有很多层节点页。树的深度和表的大小直接相关。
B+Tree对索引列是顺序组织存储的,所以很适合查找范围数据。例如,在一个基于文本域的索引树上,按字母顺序传递连续的值进行查找是非常合适的,所以像“找出所有以I到K开头的名字”这样的查找效率会非常高。