MySQL索引的详细介绍

  介绍

这篇文章主要介绍MySQL索引的详细介绍,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、什么是索引?

? ?在关系数据库中,索引是一种单独的,物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

? ?当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作,第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

? ? MySQL5.5以后InnoDB储引擎使用的索引数据结构主要用:B +树;本篇文章带大家以B +树前世今生为主线来聊一聊,

* *马克* *

<强>:

<强> B +树可以对& lt; & lt;=?⒆4?祝辞=,,,以及不以通配符开始的像使用索引。(MySQL5.5后)

? ?这些事实或许会颠覆你的一些认知,比如在你读过的其他文章或书中。以上这些都属于“范围查询”,都是不走索引的!

? ?没错,早5.5先以前优化器是不会选择通过索引搜索的,优化器认为这样取出的行多与全表扫描的行,因为还要回表查一次嘛,可能会涉及I/O的行数更多,被优化器放弃。

? ?经过算法(B +树)优化后,支持对部分范围类型的扫描(得利与B +树数据结构的有序性)。该做法同时也违反了最左前缀原则,导致范围查询后的条件无法用到联合索引,我们在后面详细说明。

二、索引的优缺点

1,优点

    <李>索引大大减小了服务器需要扫描的数据量 <李>索引可以帮助服务器避免排序和临时表 <李>索引可以将随机I/O变成顺序I/O

2,缺点

    <李>虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行插入、更新和删除。因为更新表时,MySQL不仅要保存数据,还要保存索引文件。 <李>建立索引会占用磁盘空间的索引文件。一般情况这个问题不算严重,但如果你在一个大表上创建了多种组合索引,且伴随大量数据量插入,索引文件大小也会快速膨胀。 <李>如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。 <李>对于非常小的表,大部分情况下简单的全表扫描更高效;

? ?因此应该只为最经常查询和最经常排序的数据列建立索引。(MySQL里同一个数据表里的索引总数限制为16个)

? ?数据库存在的意义之一就是是解决数据存储和快速查找的。那么数据库的数据存在哪?没错,是磁盘、磁盘的优点是啥?便宜!缺点呢?相比内存访问速度慢。

? ?那么你知道MySQL索引主要使用的数据结构么?

? ? B +树!你脱口而出。

? ?那B +树是什么样的数据结构? MySQL索引又是为什么选择了B +树呢?

? ?其实最终选用B +树是经历了漫长的演化:

<强>二叉排序树→<强>二叉平衡树→<强> B - Tree (B树)→<强> B +树(B +树)

? ?有小伙伴问我“B树跟B -树有什么区别”?这里普及一下,MySQL数据结构只有B - Tree (B树)和B +树(B +树),多只是读法不同罢了,“B - Tree”一般统称为B树,你叫他B -树也行~ ~

? ?还有小伙伴提到的红黑树,是编程语言中的存储结构,不是MySQL的;如Java的HashMap就是用的链表加红黑树。

? ?好了,今天就带着大家一起看一下演化成B +树的过程吧。

三、B +树索引的前世今生

1,二叉排序树

? ?理解B +树之前,简单说一下二叉排序树,对于一个节点,它的左子树的孩子节点值都要小于它本身,它的右子树的孩子节点值都要大于它本身,如果所有节点都满足这个条件,那么它就是二叉排序树。(此处可以串一下二分查找的知识点)
 MySQL索引的详细介绍

上图是一颗二叉排序树,你可以尝试利用它的特点,体验查找9的过程:

    <李> 9比10小,去它的左子树(节点3)查找李 <李> 9比3大,去节点3的右子树(节点4)查找李 <李> 9比4大,去节点4的右子树(节点9)查找李 <>李节点9与9相等,查找成功李

MySQL索引的详细介绍