mysql中的索引
1 什么是索引
- 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,
并指定索引的类型,各类索引有各自的数据结构实现。
2 索引是为了解决什么问题
- 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
索引所起的作用类似书籍目录,可用于快速定位、检索数据。
索引对于提高数据库的性能有很大的帮助。
3 索引在什么情况下应用
-
数据量较大,且经常对这些列进行条件查询。 该数据库表的插入操作,及对这些列的修改操作频率较低。
-
当满足以上两种中的任意一个条件的时候,我们就需要考虑在字段中建立索引,用来提高查询的效率,但是我们要知道索引会占用额外的磁盘空间。
-
索引一般应用在查找很频繁,但是插入,删除,修改都不频繁的场景。
4 索引的数据结构是什么
(1)为什么不会用二叉树(二叉搜索树)
- 如果使用二叉搜索树作为数据库的索引,如果二叉搜索树比较平衡,查找效率未O(logN).
- 二叉搜索树内部中序遍历结果是有序的,如果我们查找主键id < 6并且 >3的学生信息。先找到id位6的元素,再找到id为3的元素。然后再中序遍历3和6之间的元素,就是我们想要的结果,效率比较低是O(N).
- 我们知道二叉树的每个节点最多凉饿叉,当数据量比较大的时候,树的高度比较高,最终的操作效率也会越低。
(2)为什么不用哈希表
- 我们知道哈希表精确查找一个数据的时候效率是极高的,但是只能处理相等的情况也就是说只能处理这两个符号 = 和 in 。但是是无法处理 < > 等符号。
(3)真实的索引结构是一种N叉搜索树 => B+树
-
我们先需要知道什么是B树(也叫做B-树)
-
B树的每个节点都是不是二叉了,而是N叉。每个节点不是存储一个数据,而可能存储多个数据
-
我们从图上来看,每一个节点存储的数据的个数和该节点的毒是相关的,度 = 存储的数据个数+1.
-
并且再B树上查找,就是一个N分查找,效率是远远高于二叉的,并且由于每一个节点存储了多个数据,每一个节点又有多个度,和二叉树相比,在保存相同个数元素的时候,B树的高度就会比而二叉树低很多,处理范围查找的时候也会更加容易一些。
-
真实索引结构的B+树也就是从B树上开发而来的
-
-
我们可以看出非叶子节点只保存id,并且去辅助快速找到想要的id对应的节点
-
叶子节点就是将每一层元素链接到一起了,数据只会在叶子节点上保存,非叶子节点上指挥保存一些辅助的查找的边界信息
-
用B+树作为索引,查询每一条记录速度是较为平均的,不会出现效率差异大的情况
-
不需要进行额外的中序遍历,遍历结果就是中序结果,处理范围查找就更高效了。
-
叶子放到磁盘上。非叶子放到内存上,查找效率就更高了(减少了读磁盘的次数)
-
索引在内存中占用的实际开销也不高
(4)主键索引和其他索引
- 我们上面所讲的可以理解为主键索引,是根据我们所创建的主键id来进行索引的,可是若是当我们不进行主键索引的时候,比如用name来进行索引的时候,我们是先通过索引找到name对应的主键id,在根据主键id去主键索引中查找到具体记录(回表)。
(5)索引语句的应用
- 查看索引:show index from 表名。
- 创建索引: create index 索引名 on 表名(属性名)
- 删除索引:drop index 索引名 on 表名
- explain: explain后加上一个SQL语句的执行,可以帮助我们分析这个语句是否使用了缩影,以及使用了那个索引。
注释:当我们指定了一个属性为 primary key 查找的时候就是主键索引