索引是什么

咬文嚼字不一定是坏事,再了解MySQL索引前,我们不妨看看词典中是如何定义索引这个词语的:

根据一定需要,把书刊中的主要内容或各种题名摘录下来,标明出处、页码,按一定次序分条排列,以供人查阅的资料。

这里有几个关键点:
1. 索引的内容是主要内容或题名
2. 索引的具体手段是标明页码,按顺序排列
3. 索引的最终目的是供人查阅

联系到我们实际生活,就是无人不知的新华字典的拼音索引:

mysql left join or索引_索引

最终目的:帮助我们快速定位到一个字的在字典中的具体位置!

MySQL中索引

和字典的索引差不多,帮助我们快速定位记录所在位置,但低层的实现和存储结构不一样。
通常说的MySQL索引就是B-Tree索引,因为它是用B-Tree这种数据结构来存储数据的。

那么到底什么是B-Tree呢?

备注:读B树,而不是B减树,国内早期翻译引起的误会。但是有B+Tree读B加树。

我们来看看它一颗二叉树如何进化成B-Tree。
二叉树:根没有父节点,最多有两个子节点;叶子节点没有子节点;其他节点最多有一个父节点,两个子节点。

二叉查找树:左子树的key值都小于根的key值,右子树的key值都大于根的key值。造成的结果就是存放的数据是有序的,通过中序遍历(左根右)出来就是从小到大的一组数据。
为什么用查找树:它是特殊的一种二叉树。根据它得存储特性,用二分查找法查找数据比线性查找要快很多。

二叉平衡树(AVL树):左右子树的高度差不能超过1。超过1就旋转,直到平衡。如何旋转一时半会说不清,暂时抛开不管。总之最终得维持树高度的平衡。

为什么要旋转:因为二叉树有N种,和key值先后顺序有关。比如下面的两棵树都是二叉查找树,但是右边是最极端的情况,变成了线性结构,但它也满足二叉查找树的定义,但和左边的树比起来查找效率是很低的:

mysql left join or索引_查找树_02

B-树:为了快速理解,《MySQL技术内幕》给出了最简单的解释:首先它是一种平衡二叉树,所有的记录都是按大小顺序存放在同一层的叶子节点上,各个叶子节点用指针彼此相连(B+树)。最终结果如下图:

mysql left join or索引_子节点_03

B-Tree索引,就是B-Tree在数据库中的实现。(实际上是B+Tree)。

创建索引

根据创建时机:
1、建表时创建

CREATE TABLE mytable(
    ID INT NOT NULL,   
    username VARCHAR(16) NOT NULL,  
    INDEX [indexName] (username(length))  
);

2、修改表结构时

ALTER mytable ADD INDEX [indexName] ON (username(length))

3、单独创建索引

CREATE INDEX indexName ON mytable(username(length));

备注:MySQL中key和index的区别?

联合索引

创建联合索引:

alter table j_position add index idx_county_town_village(county_name,town_name,village_name);

联合索引是什么?
本质上就是上面说的B-Tree索引。只不过它得key值是(“凤阳县”,”小溪河镇”,”小岗村”)。
这些查找情况会使用索引:
A、查找”凤”开头的县
B、查找凤阳县并”小”字开头的村,是会使用索引的

但是,以下情况不会使用索引:
A、查找”阳”结尾的县
B、查找”小溪河镇”的镇

原因——最左前缀匹配。