前两天刚刚面试了一家公司,面试官提到这方面的问题,经过我一系列的回答之后,面试官回复了我“很好”两个字,应该也是回答到了他的心坎上,那么接下来我就分享一下我对数据库以及sql优化的一些经验,如果有说的不对或者遗漏的地方,欢迎大佬们指教。
首先当面试官问到这个问题的时候,我们不能只站在单纯的一个sql语句上回复,太low,我们应该从多维度来回答。
我们需要优化一个sql,那么就要知道哪个sql影响了效率,那么有三种方式:
通过德鲁伊的监控
查看数据库本身的慢日志
通过showprocesslist命令
通过这三种方式都可以定位到慢sql,那么在定位到慢sql以后我们就进行一些基本的优化,其实第一步可以直接看这条sql有没有走索引,在sql语句前面加explain,查看是否走索引,如果没有走 索引,检查sql语句有没有让索引失效,接下来就说到导致索引失效的场景了:
1.数据库自己认为 不走索引更快,那么就会导致索引失效
2.还有在like前面加了通配符,也会导致索引失效
3.数据是char或者 varchar类型的,如果在查询的额时候没有加``,那么也会索引失效
4.在where条件中用了or ,in,!=等 ,导致索引失效
那么我们在加索引的时候也不可以随便加,如果随意加索引,在操作数据库的时候也会有一个性能损耗,所以一般我们在 经常查的字段加索引,被经常修改的字段不加索引。
上面说的这些都是从sql方面入手来优化,那么我们还有从更大的维度来考虑,比如说在设计表的时候,一些固定长度的数据,我们直接用char固定长度,无法确定长度的我们就用varchar,还要考虑业务是否合理,以及表的字段的设计是否合理。那么如果数据量太大,我们是否要考虑分库分表。分库分表我们采用什么方案。如果只是读的压力大,那么我们可以采用数据库集群,采用一主多从 ,主节点写,从节点读,分担读 的压力,如果 写的压力大,我们可以搭建多主多从,来分担读写压力。