我觉得我对MySQL索引很相识,直到我碰着了阿里的口试官
副问题[/!--empirenews.page--]
信托许多人对付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%'; (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |