mysql系列之troubleshooting
mysql系列之troubleshooting
慢查询
表现响应时间长
开启慢查询日志
- slow_query_log: 以捕获执行时间超过一定数值的SQL语句。
- long_query_time: 阈值,超过计入日志
- log_queries_not_using_indexes: 记录没有使用索引的sql
获取慢查询信息
SELECT * FROM slow_log where start_time > ? |
获取当前查询 (正常情况应该为null假定sql执行很快)
select * from information_schema.processlist |
- 收到问题,诊断SQL
- 开启慢查询日志,抓出执行的慢的SQL
- 使用explain分析(基本上可以找到问题所在,但是如果还是没有摆平,我们的SQL在传输、网络、连接、死锁,需要进一步细粒度的查询和排查的时候就需要使用show profile)
- show profile
- 配合DBA 到my.cnf配置文件中对各种性能的参数调优和修改
Action:
优化sql
优化索引
慢查询监控
数据库分库分表
优化方案
索引的优化,sql语句的优化,表的优化
### 索引优化
加速查询最好的方法就是索引。
含有NULL值,就最好不要在此例设置索引
对于经常在where子句使用的列,最好设置索引
于有多个列where或者order by子句的,应该建立复合索引
like语句,以%或者‘-’开头的不会使用索引,以%结尾会使用索引
不要在列上进行运算
不要使用not in和<>
数据库优化
数据表拆分:主要就是垂直拆分和水平拆分。
水平切分:将记录散列到不同的表中,各表的结构完全相同,每次从分表中查询, 提高效率。
垂直切分:将表中大字段单独拆分到另外一张表, 形成一对一的关系。
SQL 优化
https://zhuanlan.zhihu.com/p/72071609
SELECT * 问题
- 不需要的列会增加数据传输时间和网络开销
- 对于无用的大字段,如 varchar、blob、text,会增加 io 操作
- 失去MySQL优化器“覆盖索引”策略优化的可能性
join: 小表join 大表
避免not in 或<> - 全表扫描
避免字段null
避免or , 可以使用union
避免在 where 子句中对字段进行表达式操作 - 全表扫描
select id from t where num/2=100 |
避免在where子句中对字段进行函数操作
注意优化器在数据量大的时候可能不会使用索引
避免更新cluster 索引,资源耗费大
避免大事务,提高并发