04. MySQL数据库索引

栏目: 数据库 · Mysql · 发布时间: 4年前

内容简介:面试官:当一条查询执行较慢时通常可以如何进行优化我:加索引!面试官:那么到底什么是索引,其底层又是如何实现的呢

面试官:当一条查询执行较慢时通常可以如何进行优化

我:加索引!

面试官:那么到底什么是索引,其底层又是如何实现的呢

我:懵逼!

索引的常见模型

索引的出现是为了提高查询效率,就像书的目录一样

常见的实现索引的模型有: 哈希表、有序数组和搜索树

哈希表是一种以键-值(key-value)存储数据的结构,我们只要输入待查找的值即key,就可以找到其对应的值即Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。(与HashMap类似)

优点:效率高

缺点:因为不是有序的,所以哈希索引做区间查询的速度是很慢的。

你可以设想下,如果你现在要找某字段在[a, b]这个区间的数据,就必须全部扫描一遍了。

所以,哈希表这种结构适用于只有 等值查询 的场景,不适用于 区间查询

有序数组等值查询和范围查询场景中的性能就都非常优秀

搜索树模型又可以细分为二叉树红黑树B+树

索引的实现由存储引擎来决定,InnoDB索引的实现使用B+树模型

二叉树和红黑树的搜索效率很高,但是应用在数据库中时因为数据量较大,二叉树和红黑树每次只分裂出两个分支,导致分裂层数很大,空间占用率高

而B+树选择增加分支树,把整颗树的高度维持在很小的范围内,同时在内存里缓存前面若干层的节点,可以极大地降低访问磁盘的次数,提高读的效率。

同时要注意的一点是:二叉树类数据结构效率高的前提是数据有序,这也是数据库常存在一个自增主键的原因

扩展:什么是B+树

B-树即Balance-tree即B树

04. MySQL数据库索引

B+树B+树索引并不能找到一个给定键值的具体行。B+树索引能找到的只是被查找数据行所在的页。然后数据库通过把页读入到内存,再在内存中进行查找,最后得到要在找的数据。因为页目录中的槽是按照主键顺序排列的,所以在每一个页目录中,通过二分查找,定位到数据行所在的页,然后将整个页读入内存

04. MySQL数据库索引

B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针

04. MySQL数据库索引

B树模型小结:

B(B-)树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;

索引失效

1、如果条件中有or,即使其中有部分条件带索引也不会使用,除非条件中的列全部有索引。

2、like查询是以%开头(但是以%结尾却不会失效)

3、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。(例如where ID = 3 和 where ID = "3")

4、如果 mysql 估计使用全表扫描要比使用索引快,则不使用索引。(因为server层有优化器)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

跨越鸿沟

跨越鸿沟

[美] 杰弗里·摩尔(Geoffrey A. Moore) / 赵娅 / 机械工业出版社 / 2009-1 / 36.00元

在真正涉足高科技领域之前,你有必要读一读这本书——在这个节奏飞快、竞争激烈的技术竞技场上,这本书绝对能够帮助你更容易地获得成功。 ——威廉姆·劳森 罗盛软件公司董事会主席兼CEO 最近40年来,本书对高科技营销各个方面所做出的贡献远远超过了其他任何相关书籍。如今已经有无数企业和大学分别在自己的运营和教学过程中引入了鸿沟思想,如果你还不是这些企业或大学中的一员,你可能就要担心自己的未来了......一起来看看 《跨越鸿沟》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具