小龙有话说
本期会模拟面试 MySQL 索引更深层 相关内容。
涉及知识点,MySQL 索引设计原则,使用法则,MySQL优化等
本期题改编自 ——2021届秋招 北森 二面
面试现场
叮叮叮......
面试官:“你好,我是XX面试官,请问是小龙吗?”
小龙:“您好,面试官,我是小龙”
面试官:“好的,现在有空吗,我们开始面试吧”
小龙:“嗯嗯,准备好啦”
.......
other questions
.......
面试官:“我看你简历上有提到你对 MySQL 掌握得挺好的对吧?。”
小龙:“哈哈,还算可以吧!”
面试官:“好的,能告诉我 MySQL 中的怎样创建索引吗?”
小龙:“好的,我简单说几种。”
小龙:“一种是通过 alter 命令,ALTER TABLE table_name ADD INDEX index_name (column_list);”
小龙:“也可以在创建表时创建,CREATE INDEX index_name ON table_name (column_list);”
面试官:“好的,我们都知道索引用的好与坏,可以间接影响整个系统性能,那么你平时是怎样去设计索引的呢?”
小龙:“其实道理很简单,无须繁琐花哨,在公司项目中,我们更看重的是性价比。”
独白:“来了来了,幸好在我【面试笔记】中总结过,来吧,随便挑几点吹给你听。”
面试官:“说说看~”
小龙:“总的来说,你创建索引目的就是要在尽可能少占内存情况下去设计一个合适的索引让查询速度更快。”
面试官:“不错,接着说”
小龙:“我们一般建在 where 字段匹配条件后,为了让创建索引所带来的好处大于其坏处,我们一定要在数据量大,也就是基数大的情况下才考虑索引。”
小龙:“因为创建索引本身就要占空间,操作数据也要操作索引文件,数据少得不偿失。”
面试官:“嗯嗯,不错,还有吗?”
小龙:“嗯,为了使得效率更高,应该选择区分度大,匹配度高的字段建立索引 。而且索引不适合于频繁更新的数据,因为操作数据同事需要维护索引又得花费时间。”
面试官:“OK,那假如我本来已经创建了个 (a) 索引,但是由于需求我们现在需要加上(b)索引,你觉得怎样操作更好呢?”
小龙:“ 嗯,我觉得我们创建索引方面,我们应该尽量扩展索引,而不是创建新的索引,可以合理利用联合索引,如(a)->(a,b) 。”
小龙:“除此之外,我们在使用时还得考虑索引是否会失效。不恰当的使用索引,不仅没有提高性能,反而占额外内存空间,影响效率,所以说学会如何使用也是一门学问。”
面试官:“嗯嗯,那在使用时哪些地方需要我们注意呢?”
小龙:“这个在我【面试笔记】中详细总结过啦,随便给面试官举几个吧。”
小龙:“比如,我们在写模糊查询时,如果以 %开头,索引会因此失效。”
面试官:“那你知道具体原因吗?”
独白:“牛逼,这个考得还算有水平”
小龙:“其实,你理解了索引的构造排列,你就懂了。”
小龙:”我们通常用的索引数据结构是B+树,而索引是有序排列的;索引的排列顺序是根据比较字符串的首字母排序的,如果首字母相同,就根据比较第二个字母进行排序,以此类推。“
小龙:”因此如果把 % 放在了前面,最左的 n 个字母便是模糊不定的,无法根据索引的有序性 准确的定位到某一个索引,只能进行全表扫描,找出符合条件的数据。“
面试官:“嗯嗯,好的,基础不错,那在项目中有尝试去对MySQL进行调优优化这些吗?”
独白:“幸好在我【面试笔记】中从 索引+sql语句+数据库结构优化+优化器优化+架构优化 详细总结了。”
小龙:“ 优化我们可以从很多方面考虑,比如 索引+sql语句+数据库结构优化+优化器优化+架构优化,这里简单说几个吧!”
面试官:“可以。”
小龙:“比如,我们从基本的索引考虑,尽量使用覆盖索引,5.6了还支持索引下推呢!再写多读少的场景下,可以选择普通索引而不要唯一索引,不懂可以看上一篇文章。”
小龙:“当然需要考虑索引失效,和设计原则,上文说过了,不在赘述。”
小龙:“在写 sql 时,若是主键自增的表,还可以把 Limit 查询转换成某个位置的查询,比如 select * from tb_sku where id>20000 limit 10;这样可以很好利用主键索引快速定位。”
小龙:“优化器我们还可以使用 MRR 【Multi-Range Read】将 ID 或键值读到 buffer 排序,通过把「随机磁盘读」,转化为「顺序磁盘读」,减少磁盘IO,从而提高了索引查询的性能。就暂时只说这些吧!”
面试官:“哈哈,好的,没想到你还懂这些,不错。”
小龙:“对啦,在使用过程中,我们首先应该做到写一手好 SQL ,考虑索引失效,复合查询、事务、锁等,其实把这些都注意,工作中大多数问题都已经解决啦。”
小龙:“然后假如遇上了 SQL 执行变慢,此时我们应该先排查问题所在,如果可以直接找到问题可以直接解决。实在不行再考虑从优化器参数、架构、表设计等进行优化,这才是最好的优化方案。”
面试官:“说的很好,看来平时还是有认真学习参与项目中。”
面试官:“好的,时间差不多啦,今天暂时聊那么多,下期再谈谈。”
独白:“不愧是我,真男人是也!”
知识总结
本期我们通过面试模拟逐渐深入探讨了 MySQL ,下期会继续深入剖析关于 事务、锁、日志等底层实现原理。订阅+星标持续追更
面试重点
索引设计原则?使用索引注意点?MySQL优化方案等