首页 > 技术文章 > MySQL-部分名词解释

chiyun 2020-12-01 09:48 原文

mysql索引实现的底层数据结构是?

就大部分的存储引擎,比如Innodb,MyISAM,都是利用B+树,官方文档里写的是B树,但是实际上使用是B+树,它是B树的一种延伸.还有一种memory存储引擎他使用的数据结构是哈希表。

索引的优点?

1.减少了扫描的数据类
2.将随机IO变成了顺序IO
3.加快我们查询速度

索引分类有什么?

一共有五种:
主键索引:主键索引必须非空且唯一
唯一索引
普通索引
全文索引
组合索引

B+树与B树区别

B+树只在叶子节点存储数据,B树在叶子节点还是非叶子节点都会存储数据

回表

在使用普通字段作为索引的时候,就比如说name这个字段我们平时使用的几率很高,为了提高查询效率我们给他建立了一个普通索引,因为B+树他
是在叶子节点存数据的,我们正常的id主键索引,他在树的叶子节点里存的是一行一行的数据,而想name这种普通索引的B+树里存的不是行数据,
而是这个索引对应的id值,然后mysql再按照这个id值利用主键索引去他的B+树里把数据查出来,这个过程就是回表。

索引覆盖或者叫覆盖索引

就是说一个索引他的B+树叶子节点包含了需要查询的值,不需要再进行回表查询,这就叫索引覆盖。比如上面的例子,我们现在有两条sql语句
select * from user where name='张三';
select id from user where name='张三';
因为我们的name是普通索引,叶子节点上只存放了主键的id值,所以,语句一是没有覆盖索引,需要回表,语句二覆盖索引,不需要回表

最左匹配

联合索引页是一种索引,也是需要构建B+树的,我们之间的比如主键索引,他的B+树的key是一个值,而现在key变成了一个元组,比如
(name,age)这种形式。
当我们利用联系索引进行查询的时候,查询的条件需要按照我们建立索引的字段顺序来查询,即匹配最左侧的字段,比如现在的联合索引是(name,age),那么我们使用
以下的方式是能命中索引的。
select * from user where name='张三';
select * from user where name='张三' and age=18;
select * from user where age=18 and name='张三';
# 这种情况虽然和我们建立索引的顺序不一样,但是mysql内部有优化器,会自动帮我们调整顺序,所以查询的时候和第二条是一样的
这种方式无法命中索引
select * from user where age=18;
为何无法命中请看另一篇博客,《索引失效的原理》

索引下推,谓词下推

索引下推的意思就是在我们利用索引查询的时候,mysql会根据我们的条件,在查询到的叶子节点中先对数据进行筛选,减少回表次数。是在5.6之后才有的,没有组合索引的话就没有下推才概念了,因为每次只取一个值

倒排索引

正常的来说我们的索引是正排索引,倒排索引是用来优化我们的查询效率的,尤其是在大数据,数据分析方面,想我们es就使用到了倒排索引。

正排索引

比如我们一行数据中,

文档1:hello,tom。How are you

文档2:hello,jack。what about you

那么正排索引就是如下图一样,

文档1对应的value被拆开成:hello tom How are you

文档2对应的value被拆开成:hello jack what about you

image-20201206160739260

倒排索引

倒排索引就是反了过来,把单词作为key,此时的数据就是

hello:文档1,文档2

tom :文档1

jack:文档2

。。。

image-20201206161253839

此时我们使用倒排索引,当要检索关键字的时候,比如我们要查包含了tom的文档,那么直接就返回了tom对应的文档1。如果是正排索引就需要对文档1和文档2全文查找,效率立见。

推荐阅读