04. MySQL数据库索引

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

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

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

我:加索引!

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

我:懵逼!

索引的常见模型

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

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

哈希表是一种以键-值(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层有优化器)


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

查看所有标签

猜你喜欢:

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

Hibernate

Hibernate

James Elliott / O'Reilly Media, Inc. / 2004-05-10 / USD 24.95

Do you enjoy writing software, except for the database code? Hibernate:A Developer's Notebook is for you. Database experts may enjoy fiddling with SQL, but you don't have to--the rest of the appl......一起来看看 《Hibernate》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具