数据库索引的认识
数据库的索引可以大大提高系统性能
索引类似于字典的查字母就是比如26个字母是就是索引,当我们看到b就会想到去找最前面的第二个位置,其实也算使用到插值超找,因为这26个字母从1到26分布均匀撒,数据库就是一个查找表,查找表由同一个类型的数据元素构成的集合
关键字就是对应某个字段的值(分为主关键字,次关键字)主关键字就是这个关键字(也叫键值)每行记录是独有的,那么关键字所对应的列可以叫做主关键码(也叫数据项)
查找算法
基于上面的数据库的查找表,根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(记录)行记录,
- 1 ####静态查找表
对于静态查找表,可以使用线性表结构来组织数据,这样可以使用顺序查找算法,对主关键字排序后,还可以使用binary fibnatury insertvalue三种查找算法
用于 查找某个数据元素是够在表中 或者 查找这个数据元素或者它的属性 - 2 ####动态查找表
在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素,动态查找表就需要用到排序二叉排序树这种数据结构,对于这种数据结构还引申出AVL树,2-3,2-3-4树B树,B+,红黑树等,,这些知识可能看的懂,但是用起来。。2333了
索引的原理
mysql的索引是一个数据结构,是为了数据高效的查找数据。常用的数据结构是B+tree,内个叶子节点不但存放了索引键的相关信息还增加了指向相邻叶子结点的指针,这样就形成了带有顺序访问指针的B+Tree,做这个优化的目的是提高不同区间访问的性能
为何使用索引
无索引就是顺序遍历O(N),而用了索引后而且是B+Tree 这样就可以使用一些有序查找算法了实现O(logN)的时间复杂度
索引的类型
- 1 hash索引:当我们给某张表某列增加索引的时候,将这样表的这一列进行hash算法计算,得到hash值,排序在hash数组中,以后再根据这个表的这一列查找查找表中对应的元素也就是记录时候就可以根据这个列(关键码)的关键值 hash后到 hash数组中查找 然后指向对应的地址位置
- 2 B树索引: 以B+树为存储结构实现的。MyISAM中数据文件和索引文件是分开的。Innodb的叶子节点存储的并不是表的地址,而是数据
hash索引和B树索引的对比
所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点:
1、因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询
2、每次都要全表扫描(不同索引值存在相同的hash值,所以即使查到满足hash值的数据条数,也无法从hash索引中直接完成查询操作,还需要访问表中的实际数据进行相应的比较)
3、由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按照顺序排列,所以无法利用Hash索引来加速任何排序操作
4、不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。
5、当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高的。
关于Btree索引,它是以B+树为存储结构实现的。
但是Btree索引的存储结构在Innodb和MyISAM中有很大区别。
根据这个图我们也就看出了前面所说MyISAM中数据文件和索引文件是分开的,因此MyISAM的索引方式称为非聚集,Innodb的索引方式称为聚集索引(也就是说索引文件和数据文件是放在一起的)
关于辅助索引就是主索引上的值不能重复,而辅助索引可以重复
图片.png
因此MyISAM中根据B树索引取搜索的时候若key存在,在data域找到其地址,然后根据地址去表中查找数据记录
而Innodb它跟上面不同的是叶子节点中存储的并不是表的地址而是数据,这也是称之为聚集索引的原因(Innodb的索引文件就是数据文件)
辅助索引叶子节点存储的是主键的信息,使用辅助索引的时候,检索到主键信息,然后通过主键去索引表中的数据,这就说明Innodb中不适合过长的字段,由于所有的辅助索引中都包含主索引,容易让辅助索引变的庞大