加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

我觉得我对MySQL索引很相识,直到我碰着了阿里的口试官

发布时间:2019-07-17 04:48:25 所属栏目:编程 来源:佚名
导读:信托许多人对付MySQL的索引都不生疏,索引(Index)是辅佐MySQL高效获取数据的数据布局。 由于索引是MySQL中较量重点的常识,信托许多人都有必然的相识,尤其是在口试中呈现的频率出格高。楼主自以为本身对MySQL的索引相干常识有许多相识,并且由于最近在找
副问题[/!--empirenews.page--]

我觉得我对MySQL索引很相识,直到我碰着了阿里的口试官

信托许多人对付MySQL的索引都不生疏,索引(Index)是辅佐MySQL高效获取数据的数据布局。

由于索引是MySQL中较量重点的常识,信托许多人都有必然的相识,尤其是在口试中呈现的频率出格高。楼主自以为本身对MySQL的索引相干常识有许多相识,并且由于最近在谋事变口试,以是单独温习了许多关于索引的常识。

可是,我照旧图样图森破,直到我被阿里的口试官虐过之后我才知道,本身在索引方面的常识,只是个小门生程度。

以下,是我总结的一次阿内里试中关于索引有关的题目以及常识点。

1 .索引观念、索引模子

我们是怎么聊到索引的呢,是由于我提到我们的营业量较量大,天天或许有几百万的新数据天生,于是有了以下对话:

Q:你们天天这么大的数据量,都是生涯在相关型数据库中吗?

A:是的,我们线上行使的是MySQL数据库

Q:天天几百万数据,一个月就是几万万了,那你们有没有对付查询做一些优化呢?

A:我们在数据库中建设了一些索引(我此刻很是反悔我其时说了这句话)

这里可以看到,阿里的口试官并不会像有一些公司一样拿着题库一道一道的问,而是会按照口试者做过的工作以及口试进程中的一些内容举办睁开。

Q:那你能说说什么是索引吗?

A:(这道题必定难不住我啊)索引着实是一种数据布局,可以或许辅佐我们快速的检索数据库中的数据

Q:那么索引详细回收的哪种数据布局呢?

A:(这道题我也背过)常见的MySQL首要有两种布局:Hash索引和B+ Tree索引,我们行使的是InnoDB引擎,默认的是B+树

这里我耍了一个警惕机,特意说了一下索引和存储引擎有关。但愿口试官可以问我一些关于存储引擎的题目。然而口试官并没有被我带跑...

Q:既然你提到InnoDB行使的B+ 树的索引模子,那么你知道为什么回收B+ 树吗?这和Hash索引较量起来有什么优弱点吗?

A:(溘然认为这道题有点难,可是我照旧依附着本身的常识储蓄简朴的答复上一些)由于Hash索引底层是哈希表,哈希表是一种以key-value存储数据的布局,以是多个数据在存储相关上是完全没有任何次序相关的,以是,对付区间查询是无法直接通过索引查询的,就必要全表扫描。以是,哈希索引只合用于等值查询的场景。而B+ 树是一种多路均衡查询树,以是他的节点是自然有序的(左子节点小于父节点、父节点小于右子节点),以是对付范畴查询的时辰不必要做全表扫描

Q:除了上面这个范畴查询的,你还能说出其他的一些区别吗?

A:(这个题我答复的欠好,过后百度了一下)

B+ Tree索引和Hash索引区别?

哈希索引得当等值查询,可是无法举办范畴查询

哈希索引没步伐操作索引完成排序

哈希索引不支持多列连系索引的最左匹配法则

假若有大量一再键值的环境下,哈希索引的服从会很低,由于存在哈希碰撞题目

2 .聚簇索引、包围索引

Q:方才我们聊到B+ Tree ,那你知道B+ Tree的叶子节点都可以存哪些对象吗?

A:InnoDB的B+ Tree也许存储的是整行数据,也有也许是主键的值

Q:那这两者有什么区别吗?

A:(当他问我叶子节点的时辰,着实我就猜到他也许要问我聚簇索引和非聚簇索引了)在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的长短主键索引,也被称之为非聚簇索引

Q:那么,聚簇索引和非聚簇索引,在查询数据的时辰有区别吗?

A:聚簇索引查询会更快?

Q:为什么呢?

A:由于主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值往后,还必要再通过主键的值再举办一次查询

Q:方才你提到主键索引查询只会查一次,而非主键索引必要回表查询多次。(其后我才知道,原本这个进程叫做回表)是全部环境都是这样的吗?非主键索引必然会查询多次吗?

A:(额、这个题目我答复的欠好,其后我本身查资料才知道,通过包围索引也可以只查询一次)

包围索引?

包围索引(covering index)指一个查询语句的执行只用从索引中就可以或许取得,不必从数据表中读取。也可以称之为实现了索引包围。

当一条查询语句切合包围索引前提时,MySQL只必要通过索引就可以返回查询所必要的数据,这样停止了查到索引后再返回表操纵,镌汰I/O进步服从。

如,表covering_index_sample中有一个平凡索引 idx_key1_key2(key1,key2)。

当我们通过SQL语句:select key2 from covering_index_sample where key1 = 'keytest';的时辰,就可以通过包围索引查询,无需回表。

3 .连系索引、最左前缀匹配

Q:不知道的话不要紧,想问一下,你们在建设索引的时辰城市思量哪些身分呢?

A:我们一样平常对付查询概率较量高,常常作为where前提的字段配置索引

Q: 那你们有效过连系索引吗?

A:用过呀,我们有对一些表中建设过连系索引

Q:那你们在建设连系索引的时辰,必要做连系索引多个字段之间次序你们是怎样选择的呢?

A:我们把辨认度最高的字段放到最前面

Q:为什么这么做呢?

A:(这个题目有点把我问蒙了,轻微有些忙乱)这样的话也许掷中率会高一点吧。。。

Q: 那你知道最左前缀匹配吗?

A:(我溘然想起来原本口试官是想问这个,怪本身方才为什么就没想到这个呢。)哦哦哦。您方才问的是这个意思啊,在建设多列索引时,我们按照营业需求,where子句中行使最频仍的一列放在最左边,由于MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从连系索引的最左边开始匹配。以是当我们建设一个连系索引的时辰,如(key1,key2,key3),相等于建设了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则

固然我一开始有点懵,没有遐想到最左前缀匹配,可是口试官照旧引导了我。很和睦。

4 .索引下推、查询优化

Q:你们线上用的MySQL是哪个版本啊呢?

A:我们MySQL是5.7

Q:那你知道在MySQL 5.6中,对索引做了哪些优化吗?

A:欠盛意思,这个我没有去相识过。(过后我查了一下,有一个较量重要的 :Index Condition Pushdown Optimization)

Index Condition Pushdown(索引下推)

MySQL 5.6引入了索引下推优化,默认开启,行使SET optimizer_switch = 'index_condition_pushdown=off';可以将其封锁。官方文档中给的例子息争释如下:

people表中(zipcode,lastname,firstname)组成一个索引

SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读