什么是索引?
索引是一种算法(B-tree,HASH等),索引也就是将数据列以某种算法的方式进行排列(如B-tree)本是通过全表查询(ALL) 而通过建立索引而使列数据变为有序的数据 而减少查询行数,也就比如一本书,目录也就是他的索引,如过没有目录你就得一页一页的翻,而通过目录可以大大减少数据检索的范围。
索引的分类
聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,其实理解起来非常简单,还是举字典的例子:如果按照拼音查询,那么都是从a-z的,是具有连续性的,a后面就是b,b后面就是c, 聚集索引就是这样的,他是和表的物理排列顺序是一样的,例如有id为聚集索引,那么1后面肯定是2,2后面肯定是3,所以说这样的搜索顺序的就是聚集索引。非聚集索引就和按照部首查询是一样是,可能按照偏房查询的时候,根据偏旁‘弓’字旁,索引出两个汉字,张和弘,但是这两个其实一个在100页,一个在1000页,(这里只是举个例子),他们的索引顺序和数据库表的排列顺序是不一样的,这个样的就是非聚集索引
索引的使用 建立索引的原则
为什么索引会影响数据更新? 索引会提高查询速度但是对于删除或更新是会降低的,个人想的是:索引的创建不就是将数据进行一种算法的排列,比如说B-tree,当进行更新数据和删除数据的时候这个时候这个树结构也需要重新进行排列(如果是非聚集索引相对于聚集索引效率更慢(只是本人的想象 后续会继续验证。。。。。。))所以说多了异步数据重组的这一个过程所以说update 和delete效率大大降低
索引的常见模型:
哈希表是以key-value的形式存储的数据结构, 将数据通过Hash算法进行key的定位,并且将数据直接存储在value里面,但是在通过某种算法创建key的时候有可能会出现hash冲突,在数据库中解决hash冲突就是拉出一个链表出来,如果说定位到了同一位置那么就将其使用链表连接起来,在查找的时候找到了定位的同一位置,于是就去遍历此处位置的链表,找出对应的值,'hashTable是以List的形式而list中的key对应的是链表,新增的时候是比较快的,但是它的排列顺序不是有序的,所以说你要获取某个区间的值是很慢的,所以hash table是只适合等值查询,所以说在NoSQL数据库是非常适用的。 (hashTable数据结构的详解: )
有序数组:有序数组在查询区间还是等值效率都是非常高的,使用二分法查找其时间复杂度是O(logn),但是正是因为是 因为是有序数组在进行插入数据的时候数组会整体移动,则会导致插入的效率很慢。所以这种索引模型是不适合在经常变化的表中变化的,在静态表使用是很nice的
二叉搜索树: 二叉搜索树的特点 父节点大于右儿子且左儿子大于父节点,在进行排序的时后,每个节点的排序都是以key-value的形式这个时间复杂度为O(logn) 会大大减少查询的次数,(关于二叉搜索树的介绍) 由于是每个叶子结点都会是一个数据块,块之间通过链式连接,所以说当数据量大的话会出现多次IO磁盘读取数据所以会比较慢,所以有了N叉搜索树。
innoDB的索引模型B+树 在innoDB中,表根据主键顺序以索引的形式存放的,索引组织表每一个索引都在innoDB里面都对应一个B+树