mysql慢查询日志配置及查看
查看哪些经常在链接mysql服务器:
SHOW PROCESSLIST;
查询慢查询是否开启及慢查询日志目录:
show variables like 'slow_query%';
slow_query_log:OFF为关闭 ON为开启
slow_query_log_file:慢查询日志存放目录
配置慢查询日志开启相关参数
在 [mysqld] 增加如下参数
slow_query_log = 1 # 日志超时时间 long_query_time = 1 # 日志存放目录 slow_query_log_file = /data/mysql/logs/mysql-query.log
mysql慢查询日志分片
1. 编写脚本cut_mysql_slow_log.sh
#!/bin/bash # 定时切割mysql的慢查询日志 slowlog=/data/mysql/logs/mysql-query.log mv $slowlog /data/mysql/logs/mysql-query.`date +%Y%m%d%H`.log mysqladmin -uroot -ppassword flush-logs find /data/mysql/logs/mysql-query.log -type f -mtime +30 -exec rm {} \; > /dev/null 2>&1
2. linux定时任务进行定时日志分片
crontab -e
59 23 * * * /路径/cut_mysql_slow_log.sh
3. 日志分片注意点
Linux 日志目录必须所述组为 mysql 不然日志写入可能有问题
mysql执行计划参数分析
执行计划查看:在查询sql前加 explain
explain select * from message_info where msg_no='10001000';
执行计划参数分析
select_type:查询类型 SIMPLE:简单表 ,不使用表链接或者子查询 PRIMARY :主查询,即外层查询 UNION :后面的查询语句 SUBQUERY :子查询中第一个 table: 输出结果的表别名 type: 访问类型 const/system:主键索引或者唯一索引 eq_ref:唯一索引扫描 ref:非唯一索引扫描 range: 索引范围扫描(where 后面是 between and 或 <或 > 或 >= 或 <=或 in 这些) index:索引全表扫描 all:扫描整表 possible_key: 表示查询可能用到的索引 key:实际用到的索引 key_len:索引字段的长度 ref:使用哪个列与key从表中选择行 rows:需要进行扫描表的行数 filtered:存储引擎返回数据在server层过滤后,剩下多少满足查询数量的百分比 Extra:执行计划的说明和描述 Using Index :表示索引覆盖,不会回表查询 Using Where :表示进行了回表查询 Using Index Condition :表示进行了ICP优化 Using Flesort :额外操作,不能通过索引顺序达到排序效果
mysql解决慢查询方式
1. 定时统计慢查询sql,进行监控报警等操作
2. 根据sql的执行计划来优化,比如增加索引 修改不合理的索引
3. 进行分表,数据量比较大的表进行拆表,如根据“年”“月”等进行分片
4. 增加备库,如业务支撑系统有大量数据统计在备库操作,不影响主库的写入
5. 根据业务合理优化表结构,团队内部要有sql编写的标准(如 xml里面禁止写 * 查询、查询只查询有用的字段等)
6. 对并发要求特别高的时候,可以采用中间件实现分库分表(如 shardingjdbc、mycat 等) 来实现mysql服务器高可用解决方案
java应用慢查询解决方式
1. 对于热点数据或者经常查询的数据,进行缓存中间件(如redis)进行缓存操作,减少数据库连接池操作
2. 定期进行sql的文件的代码审查,合理控制连接池大小