MySQL数据库索引原理

目的:加快查询速度,缩短寻址路径。

方法:B+ Tree.

共有1亿+数据。
total

id为主键,自带索引;uc_id非主键,默认不带索引。下图可以清晰的看出查询速度的差别!

primay key and other

建完索引后,瞬间查询出结果。

with index

这就是索引强大的能力。

为什么建完索引后会如此之快呢?首先看一个“计算机硬件延迟时间的对比图”

计算机硬件延迟时间的对比图

每次硬盘IO时间是内存的1万倍,显然瓶颈在硬盘IO。加入索引加快查询速度的原因就是大大减少了硬盘IO的次数。

MySQL索引原理

我们都有在词典上查询一个不认识的英文单词的经历,我们会从第一个字母开始逐渐的缩小查询范围来定位这个单词。我们可以这样搜索的前提是,词典的所有单词是按照一定顺序排列的,即有序。
B+ Tree

数据库的索引就是类似字典的这样一种查询方式。如上图,每个浅蓝色的块,是一个磁盘块。如果我们要查询29,就会从磁盘块1开始,落入磁盘块1.P2,磁盘块1.P2是个指针,指向磁盘块3,然后磁盘块3.P2,继续到达磁盘块8,查询到想要的数据“29”。这种数据结构是B+树,有效的减少了IO次数。
在真实的场景中,三层的B+树可以表示上百万的数据。如果上百万的数据查询只需要三次IO,那性能提升相对遍历查询是巨大的。

索引类型

在MySQL中,索引分为两大类:聚簇索引和非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同;聚簇索引能够提高多行检索的速度,而非聚簇索引则对单行的检索速度很快。
在这两大类的索引类型下,还可以将索引分成四个小类:
1,普通索引:最基本的索引,没有任何限制,是我们大多数情况下使用到的索引。
2,唯一索引:与普通索引类型,不同的是唯一索引的列值必须唯一,但允许为空值。
3,全文索引:全文索引(FULLTEXT)仅可以适用于MyISAM引擎的数据表;作用于CHAR、VARCHAR、TEXT数据类型的列。
4,组合索引:将几个列作为一条索引进行检索,使用最左匹配原则。