赞
踩
索引类似图书中的目录索引,可以提高数据检索的效率,降低数据库的IO成本。
Mysql官方的定义:
索引(Index)是帮助MySQL高效获取数据的数据结构。
可以理解为:快速查找排好序的一种数据结构。
MySQL在300万条记录左右性能开始逐渐下降,虽然官⽅方⽂文档说500~800w记录,所以我们就有必要使用上索引了。
即主索引,根据主键创建的索引,不允许重复,不允许为空值。
如果表中没有定义主键,InnoDB会选择一个唯一的非空索引代替。
如果没有这样的索引,InnoDB会隐式的定义一个主键来作为聚簇索引。
用来建立索引的列的值必须是唯一的,可以为空。
用表中普通的列构建的索引,没有任何限制
用大文本对象的列构建的索引
5.6版本之前,全文索引只能用于MyISAM储存引擎
5.6版本及以后,MyISAM和InnoDB都支持全文索引
在MySQL8之前,全文索引只对支持英文索引,对中文还不支持
MySQL8中支持了对中文分词的全文索引。
那么问题来了,问什么支持中文:
因为中文和英文有本质上的区别。英⽂是单词语句组成,⽽且都有空格,好分辨,中文是有字组成的句,⽽且有不同的意思,因此不一样。 当然目前中文分词技术已经非常成熟了,因此的mysql8种⽀持了中文的全⽂索引。
用多个列组合而成的索引,这多个列中不允许有空值
索引就是为了提高数据检索的速度,不同的索引类型要求和效率也是不一样的。
只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,
然后在hashCode相应的位置存执该值所在行数据的物理理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,⽽且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能
正常情况下,如果不指定索引的类型,那么一般是指B+Tree索引。
存储引擎以不同的方式使用B+Tree索引。性能也各有不同,但是InnoDB按照原数据格式进⾏存储。
B+TREE索引
B+TREE其实就是B+树,而B+树其实就是B树演变过来的,所以首先要了解B树,了解B树之前要先知道二叉树。
顺序查找:就是从第⼀一个元素开始,按索引顺序遍历待查找序列列,直到找出给定⽬目标或者查找失败
缺点:效率低–需要遍历整个待查询序列
二分查找法:也称为折半法,是⼀一种在有序数组中查找特定元素的搜索算法。
二叉树也存在缺点,就是当数据是顺序插入时就会改变树的形态(在非完全二叉树的时候)
平衡二叉树演变过程:
平衡二叉树经过条件的控制,再通过旋转的⽅式,完成树的平衡,不过,旋转次数过多。
在平衡二叉树稳定性的基础上,再进行优化,减少旋转次数,保证树的平衡性。
树的查找性能取决于树的高度,让树尽可能平衡,就是为了降低树的高度。
红黑树
当数据存在内存中,红黑树的效率非常高,但是文件系统和数据库都是存在硬盘上的,如果数据量过大的话,不能一次性加载到内存。
所以一棵树都无法一次性加载进内存,就没法进行查找。
因此就出现了专为磁盘等存储设备而设计的一种平衡多路查找数,也就是B树,与红黑树相比,在相同的节点情况下,一颗B树的高度远远小于红黑树的高度
B树:
B树即平衡查找树,是一种平衡树状数据结构,一般较多用于存储系统上,比如数据库或者文件系统。
3阶B树演变过程:
查找这个树中的数字7,需要3步
查找数字10,需要2步
通过这个查询步骤可以总结到:
1、查找7和10所用到的步数不一样,所需的时间不同,效率就不均衡。
2、在进行范围查找时,需要反复的返回上一节点,在进入下一节点,这种情况其实是树的遍历,叫做中序遍历,消耗了了时间
3、还有最重要的一点,在B树中,由于每一个节点就是一行数据,那么就是一次IO读区的节点更少。
B+树
B+树是在B树的基础上进行演变
B+树特征
1、B+树只有叶子节点存储数据
2、非叶子节点起到了索引的作用
3、所有叶子节点使用链表相连
优点:
1、磁盘读写代价更低
B树的数据和索引都是在同一节点上,那么每个快中包含的索引是少量的,如果想要去除比较深层的数据,意味着要读取更多的块,才能得到想要的索引和数据,那么增加了IO次数
而B+树中每个块能存储的索引是B树的很多倍,那么获取比较深层的数据,也只需要读取少量的块就可以额,那么减少了磁盘的IO次数
2、随机IO的次数更少
随机IO是指读写操作时间连续,但访问地址不连续,时长约为10ms
顺序IO是指读取和写入操作基于逻辑块逐个连续访问来自相邻地址的数据,时长约为0.1ms
在相同情况下,B树要进行更多的随机IO,而B+树需要更多的顺序IO,所以B+树效率更快
3、查询速度更加稳定
由于B+树非叶子节点不存储数据,因此所有的数据都要查询到叶子节点,而叶子结点的高度都是相同的,所以所有的数据的查询速度都是一样的
聚簇索引:索引即数据,数据即索引
非聚簇索引:找到索引仅仅是找到当前索引值和key,如果需要找到索引外的内容,需要回表。
1、数据存储方式
1、合理建立索引,创建了之后不一定用上,占用内存空间
2、多个单列索引并不是最佳选择,mysql只能使用一个索引,因此多个单列索引并不能提高查找性能,为了提高查询性能,合理简历组合/联合索引(最佳左前缀原则)
3、尽可能达成索引覆盖,如果一个索引包含所有需要查询的字段的值,直接根据索引的查询结果返回数据,而无需读表,能够极大的提高性能。因此,可以定义一个让索引包含的额外的列,解释这个列对索引而言是无用的。
4、sql语句避免嵌套语句
5、避免多表查询
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。