我以为我对Mysql索引很了解,直到我遇到了阿里的面试官

  • 日期:08-01
  • 点击:(1503)

永盈会投注网

  本文来自一位不愿意透露姓名的粉丝投稿,由小编整理并'恢复'采访网站。

我相信很多人都熟悉MySQL索引。索引是一种帮助MySQL有效获取数据的数据结构。

因为索引是MySQL中比较重要的知识,我相信很多人都有一定的了解,特别是在访谈中。房东认为他对MySQL索引有很多了解,而且由于他最近正在寻找求职面试,他已经回顾了很多关于索引的知识。

然而,我仍然发现图森破了,直到我被阿里的面试官虐待,我意识到我的索引知识只是小学一级。

以下是阿里访谈中与指数相关的问题和知识点的摘要。

1.指数概念,指数模型

我们是如何谈论索引的,因为我提到我们的业务量相对较大,每天都有数百万的新数据,所以我们有以下对话:

问:您是否每天都存储在关系数据库中的大量数据?

答:是的,我们在线使用MySQL数据库

问:每天有数百万的数据,每月数千万美元,那么你对查询有一些优化吗?

答:我们在数据库中创建了一些索引(我现在非常后悔当时这么说了)

在这里你可以看到阿里的面试官不会像公司那样提出问题,但他会根据面试官的行为以及面试过程中发生的事情来做。

问:那么你对这个指数有什么看法?

答:(这个问题对我来说绝对不难。)索引实际上是一种数据结构,可以帮助我们快速从数据库中检索数据

问:索引具体使用哪种数据结构?

答:(我也背诵这个问题)常见的MySQL有两个主要结构:哈希索引和B +树索引。我们使用InnoDB引擎。默认为B +树

在这里我玩了一个小心的机器,特别是谈论索引和存储引擎。我希望面试官可以问我一些关于存储引擎的问题。然而,面试官并没有被我带走.

问:既然你提到了InnoDB使用的B +树的索引模型,你知道为什么使用B +树吗?与哈希指数相比,这有什么优缺点?

答:(突然之间,这个问题有点困难,但我仍然依靠我的知识来简单回答一些问题),因为哈希索引的底部是哈希表,哈希表是一个用密钥存储数据的结构-值。因此,存储关系中的多个数据完全没有任何顺序关系。因此,对于区间查询,不可能直接通过索引查询,并且需要全表扫描。因此,哈希索引仅适用于等效查询的场景。 B +树是一个多路平衡查询树,因此他的节点是自然排序的(左子节点小于父节点,父节点小于右子节点),所以没有必要这样做范围查询的全表扫描。/P>

问:除上述查询范围外,您能否告诉我一些其他差异?

答:(我没有很好地回答这个问题,之后是百度)

B + Tree索引和Hash索引有什么区别?

散列索引适用于等价查询,但范围查询不可能

哈希索引不能使用索引来完成排序

散列索引不支持多列联合索引的最左侧匹配规则

如果存在大量重复键值,则由于哈希冲突问题,哈希索引的效率会很低

2.聚集索引,叠加索引

问:刚谈到B + Tree,那么你知道在B + Tree的叶子节点中可以保存什么东西吗?

答:InnoDB的B + Tree可能存储整行数据,也可能是主键的值

问:两者有什么区别?

答:(当他向我询问叶子节点时,我实际上猜到他可能会问我有关聚簇索引和非聚集索引的信息。)在InnoDB中,索引B + Tree的叶子节点存储整行数据。主键索引,也称为聚簇索引。索引B + Tree的叶节点将主键的值存储为非主键索引,也称为非聚簇索引

问:那么,在查询数据时,聚簇索引和非聚簇索引之间是否存在差异?

答:聚集索引查询会更快吗?

问:为什么?

答:因为主键索引树的叶节点直接是我们想要查询的整行数据。不是主键索引的叶节点是主键的值。找到主键的值后,需要再次使用主键的值查询。

问:您刚才提到主键索引查询只会被检查一次,而不是主键索引,您需要多次查询表。 (我后来才知道这个过程被召回到表中)在所有情况下都是如此吗?是否会多次查询非主键索引?

- 答:(金额,我回答的这个问题不好,那我自己只知道信息,你只能通过覆盖索引查询一次)

覆盖指数?

覆盖率索引是指只能从索引获取的查询语句的执行,而不必从数据表中读取。它也可以被称为实现索引覆盖。

件时,MySQL只需要通过索引返回查询所需的数据,从而避免在找到索引后返回表操作,从而降低I/O效率。

例如,表coverage_index_sample具有正常索引idx_key1_key2(key1,key2)。

当我们传递SQL语句时:selectkey2fromcovering_index_samplewherekey1='keytest';我们可以覆盖索引查询而不必返回表。

3.联合索引,最左前缀匹配

问:如果你不知道,那没关系。我想问一下,在创建索引时你会考虑哪些因素?

答:我们通常有很高的查询概率,并且经常将索引设置为where condition

的字段

问:你使用过联合指数吗?

答:使用过,我们在一些表上创建了一个联合索引

问:创建联合索引时,需要执行联合索引。你如何选择多个领域之间的顺序?

答:我们把最知名的领域放在前面

问:你为什么这样做?

答:(这个问题对我来说有点混乱,有点慌乱。)如果你这样做,命中率会更高。

问:你知道最左边的前缀匹配吗?

答:(我突然想起面试官想问这个,并责备自己为什么他没有想到它。)哦,哦。你问的是这个。在创建多列索引时,我们根据业务需求将最常用的列放在最左侧的where子句中,因为MySQL索引查询将遵循最左前缀匹配的原则,即最左边的首先,在检索数据时从union索引的最左侧进行匹配。所以当我们创建一个联合索引时,例如(key1,key2,key3),它等同于创建(key1),(key1,key2)和(key1,key2,key3)三个索引,这是最左边的匹配原则。

虽然起初我有点尴尬,但我没想到最左边的前缀匹配,但面试官带领我。非常友好。

4.索引下推,查询优化

问:您在线使用哪个版本的MySQL?

答:我们的MySQL是5.7

问:你知道在MySQL 5.6中对索引进行了哪些优化吗?

A:对不起,我不知道这件事。 (之后我检查过,还有一个更重要的:IndexConditionPushdownOptimization)

IndexConditionPushdown(索引下推)

MySQL 5.6引入了索引推送优化,默认情况下使用SEToptimizer_switch='index_condition_pushdown=off'启用;它可以关闭。官方文件中给出的例子和解释如下:

人员表(zipcode,lastname,firstname)构成索引

选择*FromPeopleWherZipCode=''和LastnameLike“%Etrunia%”,地址Like“%Mainstreet%”;

如果不使用索引下推技术,MySQL将通过zipcode=''从存储引擎中查询相应的数据。返回mysql服务器后,mysql服务器将根据lastnamelike“%etrunia%”和addresslike“%mainstreet%”确定数据是否合格。

件查询的情况下表返回的次数。

问:您有这么多自己创建的索引吗,或者您有关于SQL语句的统计信息吗?你有数据吗?

答:这还没有计算在内,除非我们遇到慢SQL,否则我们将检查它。

问:在调查时,有没有办法知道是否有索引查询?

答:您可以通过explain查看SQL语句的执行计划,并通过执行该计划来分析索引的使用情况。

问:在什么情况下会显式创建索引,但在执行索引时不会传递索引?

答:(可能记得与优化器有关,但这个问题没有得到很好的回答)

查询优化器?

SQL语句查询可以具有不同的执行计划。至于选择哪种解决方案,您需要通过优化器选择它,并选择执行成本最低的解决方案。

在实际执行单表查询之前,MySQL的查询优化器将找出执行该语句的所有可能方案,然后在比较后找到成本最低的解决方案。

成本最低的选项是所谓的执行计划。优化过程大致如下:

件确定所有可能的索引

2.计算全表扫描的成本

3.计算使用不同索引执行查询的成本

4.比较各种实施方案的成本,找到成本最低的方案

问:哦,关于指数的知识,我们暂时要求很多。您的在线数据的事务隔离级别是多少?

答:(关于事务隔离级别的问题之后,它不会被扩展)

感觉因为我没有回答得足够多。如果我有这些索引问题,他会问更多,我担心它会被滥用更多。

5.总结和情绪

以上是访谈中知识的索引部分和我编写的答案的问题。我觉得关于面试过程中的索引知识,我可以回答大约70%的内容,但自信的内容只有50%左右。似乎关于索引的知识还不够。

通过这次采访,我发现像阿里这样的大工厂仍然更关注潜在的知识。我以前认为指数是最相关的。 Hash和B +有什么区别?我没想到最后会问查询优化器。

最后,无论这次采访能否通过,我都非常感谢有机会让自己看到自己的缺点。通过这次采访,我也获得了很多东西。来吧!