小龙有话要说,本期将模拟面试MySQL索引更深层次的相关内容。涉及知识点,MySQL索引设计原则,使用规则,MySQL优化等。本题改编自——2021秋招北森二期面试现场叮叮叮...面试官:“你好,我是XX面试官,请问是小龙吗?”小龙:“面试官你好,我是小龙”面试官:“好了,你现在有空吗,下面开始面试”小龙:“嗯,我准备好了”。......其他问题......面试官:“我看到你的简历中提到你对MySQL掌握得很好,对吧?”小龙:“哈哈,还不错!”面试官:“好的,你能告诉我如何在MySQL中创建索引吗?”小龙:“好吧,我简单说几句。”小龙:“一种是通过alter命令,ALTERTABLEtable_nameADDINDEXindex_name(column_list);”小龙:“也可以在建表的时候创建,CREATEINDEXindex_nameONtable_name(column_list);”面试官:“好吧,我们都知道索引的好坏,可以间接影响整个系统的性能,那么你平时是怎么设计索引的呢?”小龙:“其实道理很简单,没必要繁琐花哨。在公司项目中,我们更注重性价比。”】,来,随便挑几个点吹给你。”面试官:“说吧~”小龙:“总的来说,你创建索引的目的就是在设计的时候尽量少占用内存。合适的索引让查询更快。”面试官:“对,那就继续”小龙:“我们一般是在where字段匹配条件后建的。为了让创建索引利大于弊,我们必须在数据量大的时候,也就是基数大的时候才考虑索引。”小龙:“因为创建索引本身就占空间,而且操作数据还需要操作索引文件,数据少得不偿失。”面试官:“嗯,对了,还有吗?”小龙:“嗯,为了更高效,应该选择区分度高、匹配度高的字段建立索引。而且索引也不适合频繁更新的数据,因为数据同事的操作需要维护索引,成本很高。时间。”面试官:“好吧,如果我已经创建了一个(a)索引,现在由于需求需要添加(b)索引,你觉得怎么操作比较好?”小龙:“嗯,我觉得我们在索引创建方面,我们应该尽量扩展索引而不是创建新索引,可以合理使用联合索引,比如(a)->(a,b)。小龙:“另外,我们还要考虑索引在使用的时候会不会失效。”索引使用不当不仅不会提高性能,反而会占用额外的内存空间,影响效率,所以学会使用也是一门学问。”面试官:“嗯,那我们在使用的时候要注意什么?”小龙:“这个我在【面试手记】里已经总结的很详细了,给面试官几条就可以了。写一个模糊查询,如果以%开头,索引就会失效。”面试官:“那你知道具体原因吗?独白:“厉害了,这个测试还不错。”小龙:“其实你了解了索引的结构和排列就明白了。””小龙:“我们平时使用的索引数据结构是B+树,索引是按顺序排列的;索引的顺序按照比较字符串的首字母排序。如果第一个字母相同,则按照第二个字母进行比较。排序等等。”小龙:“所以%放在前面的话,最左边的n个字母是有歧义的,无法按照索引的先后顺序准确定位到某个索引。只有全表扫描才能找到匹配的索引。条件数据。”面试官:“嗯,ok,基础不错,有没有在项目中试过调优MySQL?优化+优化器优化+架构优化,总结的很详细。”小龙:“我们可以考虑很多方面的优化,比如索引+sql语句+数据库结构优化+优化器优化+架构优化,这里简单提几个!”面试官:“是的。”小龙:“比如我们考虑基础索引,尽量使用覆盖索引。5.6还支持索引下推!在写多读少的场景下,可以选择普通索引,而不是唯一索引。不明白的可以看一篇文章。”小龙:“当然需要考虑索引失效和设计原则,上面已经说了,这里不再赘述。”小龙:“写sql的时候,如果主键是自增表,也可以把limit查询转成某个位置的查询,比如select*fromtb_skuwhereid>20000limit10;这样可以很好用的主键索引来快速定位。”小龙:“优化器也可以使用MRR【Multi-RangeRead】将ID或键值读入缓冲区进行排序。通过将“随机磁盘读取”转换为“顺序磁盘读取”,减少了磁盘IO,从而提高了性能。索引查询的性能。暂时先说这个吧!”面试官:“哈哈,好吧,没想到你会知道这个,还不错。”小龙:“对啊,在使用的过程中,首先要写好SQL,考虑索引失效,复合查询,事务,锁等等,其实关注这些,工作中的大部分问题已经解决了。”小龙:“而且如果SQL执行速度变慢,首先要排查问题。如果我们能直接找到问题,我们就可以直接解决。如果不行,从优化器参数、架构、表设计等方面考虑优化,这是最好的优化方案。”面试官:“那很好,看来我还是好好学习,参与项目。”面试官:“好了,时间差不多了。今天就说这么多,下次再说吧。”“独白:”不愧是大汉!知识总结本期我们通过面试模拟,逐步深入探索MySQL。下一期,我们将继续深入剖析事务、锁、日志的底层实现原理。订阅+星继续关注更多面试关键指标设计原则?使用索引的注意事项?MySQL优化方案等
