什么是MySQL索引?
全网最全面的mysql索引总结!!!
目录
1.索引是什么?
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引(index):好比书的目录,用于加快查找的效率;
索引的作用:加快查找效率.减慢插入和删除,修改效率.(需要同步调整索引结果)
2.索引要解决的问题
如果数据库中没有索引,此时查找的时候就需要把整个表遍历一遍.,如果想找id为8的学生信息.,没有索引,此时的查找过程就相当于一个"顺序表查找",内存访问速度多快,并且数据也没那么多,其实速度也还行.,如果是针对数据库顺序查找,数据库的数据是在磁盘上.磁盘访问速度更慢,并且数据量也可能非常多.,这个速度可能就会很慢.,索引就是为了避免数据库进行顺序查找.提高查找效率.。
3.索引的应用场景
应用的场景主要是应用在查找很频繁,但是插入,删除,修改都不频繁的场景.[非常常见]
以作业为例:每次布置作业,都相当于要进行查找.插入删除修改操作,就非常少,一学期改一次.
4.索引的数据结构
为什么不用哈希?
哈希表查找效率是O(1)
数据库的索引可以考虑使用哈希,但是也有问题.例如:查找id<6并且>3的学生信息., select * from student where id < 6 and id > 3,只能处理相等的情况,不能处理其他的逻辑.> >= < <= between and...;
哈希的查找过程:把key代入哈希函数,计算得到下标,再根据下标取到对应的链表,再去遍历比较key是否相等。
总而言之,哈希只能处理相等的情况,不能处理范围的情况、
为什么不用二叉搜索树?
传统的二叉树:
二叉树是大家熟知的一种树,用它来做索引行不行,可以是可以,但有几个问题:
- - 如果索引数据很多,树的层次会很高(只有左右两个子节点),数据量大时查询还是会慢
- - 二叉树每个节点只存储一个记录,一次查询在树上找的时候花费磁盘IO次数较多,所以它并不适合直接拿来做索引存储,算法设计人员在二叉树的基础之上进行了变种,引入了BTREE(B树)的概念。
-获取中序遍历结果效率不高. 此时处理范围查找也就比较低效.
什么是B树,有什么优势?
如上图可知BTREE有以下特点:
- - 不再是二叉搜索,而是N叉搜索,树的高度会降低,查询快
- - 叶子节点,非叶子节点,都可以存储数据,且可以存储多个数据
- - 通过中序遍历,可以访问树上所有节点
- BTREE被作为实现索引的数据结构被创造出来,是因为它能够完美的利用“局部性原理”,其设计逻辑是这样的:
- - 内存读写快,磁盘读写慢,而且慢很多
- - 磁盘预读:磁盘读写并不是按需读取,而是按页预读,一次会读一页的数据,每次加载一些看起来是冗余的数据,如果未来要读取的数据就在这一页中,可以避免未来的磁盘读写,提高效率(通常,一页数据是4K)
- - 局部性原理:软件设计要尽量遵循“数据读取集中”与“使用到一个数据,大概率会使用其附近的数据”,这样磁盘预读能充分提高磁盘IO效能
什么是B+树,有什么优势?
B+TREE改进点及优势所在:
- - 仍然是N叉树,层级小,非叶子节点不再存储数据,数据只存储在同一层的叶子节点上,B+树从根到每一个节点的路径长度一样,而B树不是这样
- - 叶子之间,增加了链表(图中红色箭头指向),获取所有节点,不再需要中序遍历,使用链表的next节点就可以快速访问到
- - 范围查找方面,当定位min与max之后,中间叶子节点,就是结果集,不用中序回溯(范围查询在SQL中用得很多,这是B+树比B树最大的优势)
- - 叶子节点存储实际记录行,记录行相对比较紧密的存储,适合大数据量磁盘存储;非叶子节点存储记录的PK,用于查询加速,适合内存存储
- - 非叶子节点,不存储实际记录,而只存储记录的KEY的话,那么在相同内存的情况下,B+树能够存储更多索引
B+树好处总结:
- 查询任何一条记录速度是比较平均的,不会出现效率差异大的情况.
- 不需要进行额外的中序遍历了.遍历链表就是得到中序结果.处理范围查找就更高效了.
- 叶子放到磁盘上,非叶子放到内存中.查找效率就更高了(减少了读磁盘的次数)索引在内存中占用的实际开销也不高.
PS:主键索引!!!!
5.其他注意事项
- 索引起到的效果:加快查找效率.减慢插入和删除,修改效率.(需要同步调整索引结果)
- 索引也会占用额外的空间(本质上使用空间来换时间)
- 给具体的表中某列加索引的时候,加在主键上的索引和加在其他列上的索引是截然不同的.
更多推荐
所有评论(0)