远离八股文,面试大白话,通俗且易懂
看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。
这是面试总结出来的几点,每次问道都是这么回答,分层分点。
首先搞懂sql优化的目的是什么,然后针对每个目的具体做什么操作。
目的一:减少磁盘IO次数
在数据库中主要是来自于像全表扫描这种扫描大量数据快的场景,然后就是日志以及数据块的写入所带来的压力
1. 可以通过加索引来避免全表扫描,但是索引根据实际情况添加,太多的时候就会影响新增修改等操作的性能-有得必有失(正常情况下一张表尽量6个以内差不多)
2. select查询的时候不使用select * ,明确要查询的字段,非必须的字段会占用磁盘内存空间
3. 尽量避免使用子查询(子查询会建立临时表、撤销临时表消耗cpu和io资源,另外临时表肯定没有索引,一定情况下会影响效率)
目的二:减少网络宽带
第一是返回数据太多,数据传输消耗较多。第二是频繁新增更新建立链接
1.sql查询时使用limit减少返回的数据,有时候分大量数据多次查询比一次性大量数据效率要高,甚至可以使用多线程更快。
2.新增、修改等等操作尽量避免多次循环操作,要使用values(),一次性操作,而不是一条一条的去操作。
目的三:降低CPU的消耗
1.join多表联查要尽量优化,有时候冗余字段占不了多少空间,但是如果没有冗余字段就得连表查询,这样就会增加sql复杂度。
2.order by 、group by等操作尽量作用在索引上
3.聚合函数(max、count、sum等),如果数据量比较大,会非常占用时间,mysql引擎原理是把数据一条一条取出来然后进行聚合计算。所以数据量大的时候,聚合函数就非常耗时。
tips:经典例题就是mybatis分页查询的时候,有时候sql直接执行很快,但是通过mybatis分页查询就慢,原因就是分页查询里面会进行count查询总数
针对聚合函数慢的解决方法可以使用统计表,每天将数据统计好存入统计表中,也就是统计表中每天就只有一条数据或者纬度细一点多条数据。这样后面统计直接查询统计表即可、
这是大概的总结 ,我每次遇到这样的问题都是固定模式:
面试官:你对于sql优化有没有经验?
我:之前在工作中遇到过也做过总结,就是看我们的需求是什么,进而对应的做出优化方案。我总结了大概有三点,第一点就是减少磁盘io次数,对于这个可以做的是通过加索引....第二点是...第三点是 .....