一 如果执行SQL响应比较慢,可能有以下四个原因:
1 没有索引或者是SOL没有命中索引,导致索引失效。
2 单表数据量过多,导致查询遇到瓶颈。
3 可能是网络原因,或者机器负载过高。
4 热点数据导致单点负载不均衡。
二 解决方案
1 打开 MySQL的慢查询日志,然后收集一段时间的慢查询,找出耗时最长的 SOL 语句,对这些 SOL语句再进行分析,利用执行计划 explain去查询 SQL是否有命中索引,如果没有命中,则优化SOL语句,保证 SOL走索引执行。如果SOL语句的结构没有办法再优化,可以考虑表上再增加对应的索引,要注意一点,在优化SOL或添加索引的时候,需要符合最左匹配原则。
2 对表进行切分。表切分法有两种:水平切分和垂直切分。水平切分就是把一张千万级的大表,根据业务主键切分为多张小表,那么这些小表可能达到100张,甚至是1000张;垂直切分就是将一张表中的多个列,按照业务逻辑把它关联性比较大的列放在同一张表上去。除了切表,还可以分库,比如已经将大表拆分为1000张小表后,将后缀为1-100的表放到一个数据库实例中,然后再将101-200的表放到另一个实例中,依次类推把1000个表分别放到10个数据库实例中。这样就可以根据业务的主键把请求路由到不同的数据库实例,然后每个数据库实例承担相应的流量,这样均摊的流量就比较小,从而达到数据库性能提升的目的。
3 数据库读写分离部署。Mysql支持一主多从的分布式部署,主库只用来处理写操作,多个从库负责读的操作。在流量比较大的场景,可以增加从库来提高数据库的负载能力,从而提升数据库总体性能。
4 除数据库本身的调整外,还可以增加缓存,然后将查询比较频繁的热点数据,存到缓存中,比如Redis,MongoDB,ES等,以此来缓解数据库的压力,从而提高数据库的响应速度。