Mysql中的索引

时间:2024-10-27 07:35:37

1.索引是什么?
       

  1.1概念

     索引是一种特殊的文件,包含着对数据表里所有记录的引用指针.可以对表中的一列或者多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现.

 1.2作用

        其实大家可以把它类比于书的目录,我们可以快速定位,检索数据,加快查询速度

        平时使用的select查询是按照"遍历"的方式来查询,时间复杂度为O(N),每取一次都要读硬盘.

        内存中的O(N)和硬盘读取的O(N)有质的区别,内存的读取比硬盘快的多.

        索引的缺点:

        索引也是有缺点的,有可能会影响到数据的增删改查(不一定).

        

1.3索引的使用场景

        1.数据量比较大,切经常对这些列进行条件查询

        2.该数据库表的插入操作切对这些列的修改操作频率较低(有可能影响到增删改查)

        3.索引会占用额外的磁盘空间(这个不怕,大不了咱们加硬盘)

        反之,非条件查询列,或经常插入删除修改操作,或磁盘不足时候,不考虑创建索引.

1.4索引的使用      

        创建主键约束(Primary key),外键约束(Foreign key),唯一约束(Unique)时,会自动创建对应列的索引

查看索引:

show index from 表名;

 创建索引:对非主键,非唯一性约束,非外键的字段可以创建普通的索引

1.这也是个危险的操作:数据量小(几千,几万)谈不上危险,数据量大(千万级别的),创建会触发大量的IO硬盘,会把机器卡死,甚至会把数据库搞挂掉

2.如果非要加入索引最好的办法是使用移花接木:用新的服务器,在创建的时候时候加入索引,并且将数据全部拷贝一份,再转用新的服务器.

注:在最初建表,有哪些索引要提前规划创建好.

3.之所以主键约束,外键约束,唯一性约束都自带索引,是因为,这些操作都设计到查询操作,在子表进行修改/删除操作的时候需要查询父表,在父表插入删除进行修改/删除操作也需要查询子表

create index 索引名 on 表名(列名);

删除索引:

这也是一个危险的操作(容易将数据库搞挂掉)并且只能删除自己创建的索引.

drop index 索引名 on 表名; 

 

1.5索引使用到的数据结构

B+树是为数据库量身定制的数据结构

B树,也可以成为B-树,这里的-不是减号,而是连接符

B树的介绍

B树为N叉搜索树,每个节点上可以有N个节点(树的度为N)

N叉树可以有效的降低树的高度,每个节点就不是存储一个Key值,而是多个

某个节点保存了N个Key,就能延伸出N+1个子树,此时,进行查询时,针对每个节点就需要比较多次,才能确定下一步走的是哪个区间.

虽然高度降低了,但是每个节点的比较次数变多了,真的能比二叉树有优势吗?

注:其实优势还是很大的!!每个节点访问的时候都是一次硬盘IO就可以了,和某个节点比较的时候,是先进行了一次硬盘IO,把所有这个节点上的内容读取出来,接下来的比较都是在内存中进行的

                             这里的目不是为了减少比较次数,而是为了减少硬盘IO的次数

B+树的介绍

B+树是针对B树进行的进一步改进的数据结构,B+树也是N叉搜索树

不同于B树,B树是有N个key划分成N+1个区间

B+树是有N个Key划分为N个区间

父节点中的key值会在下节点中再次出现(以子节点的最大值出现)

所有的叶子节点,就构成了整个树的数据全集

表里的每一行都是出现在B+树的叶子结点上

非叶子节点只需要存储一些数字即可

重复出现的做法看起来好像是浪费空间,实际上非常有用

B+树把叶子节点像链表一样首尾相连,此时进行"范围查询"就会非常有用

B+树的优势:

1.N叉搜索树,高度比较低,此时硬盘IO次数就比较少

2.叶子结点是全集,并且用链表结构连接,非常便于进行"范围查询"

3.B+树所有的查询都是要落到叶子节点,完成任何一次查询经历的IO次数和比较次数差不多,查询开销稳定

4.由于B+树叶子结点就是全集,非叶子节点不必存储数据行,只需要存储索引列的key即可,使得非叶子节点消耗空间比较小,甚至这样的数据可以直接加载到内存中,这样进一步减少了硬盘IO的次数