我们在学习MySQL的时候经常会听到索引这个词,大概也知道这是什么,但是深究下去又说不出什么道道来。下面将会比较全面的介绍一下关于索引!
索引是什么?
这里用百度百科的一句话来说,在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
简单来说,索引就是我们一本书的目录,通过目录我们才能更快在一本书中查找到我们所要看的内容。同样的,通过索引我们才能在数据库中查找到我们的数据!
没使用索引的MySQL
我们知道索引可以加快我们的查找,所以这里通过没有使用索引的查找可以更加地让我们认识到使用索引的好处。
我们的MySQL基本的页存储结构是页,也就是我们的数据记录都在页里面。
当我们插入一条记录的时候就会存储在我们的数据页中的存放行记录的位置,并在我们的Page Directory页目录那里生成主键的信息。我们的数据页中记录又可以组成一个单链表,每插入一条数据就会在尾节点那里添加上。
当我们通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。如果不是主键的话,那么只能遍历单链表中的每条记录对比查找。
所以,如果不用索引优化的话,那么在进行一条查找的sql的话,默认的流程是这样子的:
定位到记录所在的页(需要遍历双向链表,找到所在的页)
从所在的页内中查找相应的记录(是不是根据主键查询,不是只能遍历所在页的单链表了)
如果在数据量特别大的时候,又是极端情况,遍历双向链表和单链表,速度就会显得非常慢!
B-Tree索引与B+Tree索引
B-Tree索引结构
当人们开始谈论索引的时候,如果没有特别指明类型的话,那么多半说的就是B-Tree(B树)所以,它使用的是B-Tree数据结构来存储数据,大多数的MySQL引擎都支持这种索引(但实际上很多存储引擎使用的是B+Tree,这个我们稍后再谈到)。我们这里通过B-Tree索引结构就可以极大的优化了上面的查找。
从图中我们可以很明显的感受到