系统变慢,第一反应常是服务器不行了。但十次里有七八次,问题出在数据库的查询上。这次讲怎么排查。碰面时他问起,数据库优化做了到底有没有用。我的判断是,先看这件事有没有人反对。
先看是不是缺索引
最常见的原因是查询的字段没有索引。数据量小的时候看不出来,上万条以后就开始明显变慢。
判断的办法是看查询条件用到了哪些字段,再去检查这些字段有没有索引。没有的,加上试试,往往立竿见影。
但索引也不是越多越好。加多了会影响写入速度,按实际查询来加,别一股脑全加上。
再看查询是不是写太宽
有的查询一取就是整张表。用不上的字段也拉出来,白白增加了负担。
只取需要的字段,只查需要的数据,这是最基本的一条。写的时候图省事用全字段,后面就要还这笔账。
还有一种是一次查太多行。列表页要分页,别一次把几万条都取出来再在程序里切。
还要看数据量涨了没
系统刚上线很快,用了一年变慢,这很正常。数据量涨了,原来的写法可能就不够用了。
这时候要么优化查询,要么把历史数据归档。老数据不常查,挪出去能明显减轻负担。
我们的习惯是定期看一眼数据库的增长速度,提前做规划,别等到卡得用不了才动手。
什么时候该考虑拆分
数据量涨到一定程度,光靠优化查询就不够了,得考虑拆分。
拆的方式有好几种,按时间拆、按业务拆,选哪种看查询的规律。大多数查询都带时间范围,按时间拆更顺。
拆分别一步到位。先把最老的那部分数据分出去,观察一段时间再往下走,比一次改彻底安全。
拆之前一定先备份,并且想好怎么查历史数据。分出去的数据还是要能查到,不能有了新库就丢了老数据。
还有一点是别为了拆而拆。数据量不大、优化一下就能解决的,没必要上分布式,复杂度也是一种成本。
做数据库优化,这几个问题绕不开
加了索引还是慢怎么办
看索引有没有生效、查询语句是不是用不上它。有时写法不对,索引等于白加。
要不要换更好的服务器
先排查查询。查询问题不解决,加服务器也只是拖时间,治标不治本。
多久要优化一次
不用定期做,但数据量明显增长时,或者发现变慢时,就该查一遍。
常斌的观点可能有点硬:先看慢查询日志,再动手,不凭感觉猜。
先看日志
我的建议是先把慢查询日志打开,看哪些语句花的时间最长。花时间最多的那一两条,就是优化的重点。
我们手上交出去的那 300 多个小程序,不少还在稳定跑着。信服无限经手运维时,会把数据库健康检查当成常规项。换系统之前,告诉我你的系统大概什么量级。