MySQL慢查询
2020-12-01 14:36:18 0 举报
AI智能生成
登录查看完整内容
MySQL慢查询
作者其他创作
大纲/内容
MySQL慢查询
慢查询参数配置
slow_query_log
是否启用慢查询日志,1为启用,0为禁用
slow_query_log_file
指定慢查询日志文件的路径和名字,可使用绝对路径指定
默认值是'主机名_slow.log',位于datadir目录
long_query_time
SQL语句运行时间阈值,执行时间大于参数值(单位秒)的语句才会被记录下来
min_examined_row_limit
SQL语句检测的记录数少于设定值的语句不会被记录到慢查询日志,即使这个语句执行时间超过了long_query_time的阈值
log_queries_not_using_indexes
将没有使用索引的语句记录到慢查询日志,1为启用,0为禁用
log_throttle_queries_not_using_indexes
5.6版本设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间mariadb没有这个参数
log_slow_admin_statements
log_slow_slave_statements
log_timestamps
5.7版本新增时间戳所属时区参数
5.6版本记录从库上执行的慢查询语句mariadb没有这个参数
默认值:记录UTC时区的时间戳到慢查询日志
推荐值:system,应修改为记录系统时区
mariadb没有这个参数
log_output
指定慢查询日志的输出方式,从5.5版本开始可以记录到日志文件(FILE,慢查询日志)和数据库表(TABLE,mysql.slow_log)中
mysqldumpslow
命令行格式
mysqldumpslow [ OPTS... ] [ LOGS... ]
参数说明
-s 表示按照何种方式排序\tc 访问次数\tl 锁定时间\tr 返回记录\tt 查询时间\tal 平均锁定时间\tar 平均返回记录数\tat 平均查询时间-t 返回前面多少条数据-g 后边搭配一个正则匹配模式,大小写不敏感
常用命令
得到返回记录集最多的10条SQL:
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log
得到访问次数最多的10条SQL:
mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log
得到按照时间排序的前10条里面含有左连接的SQL:
mysqldumpslow -s t -t 10 -g \"left join\" /var/lib/mysql/slow.log
也支持管道符命令
mysqldumpslow -s t -t 10 -g \"left join\" /var/lib/mysql/slow.log | more
pt-query-digest
pt-query-digest [OPTIONS] [FILES] [DSN]
慢查询方式
索引相关问题
索引缺失
对于经常性的查询需求,可以建索引,偶尔查询内容不需要建。
索引重复
主要是复合索引和单列索引有重复的
索引过多
一般单表索引建议在7个以内,尽量不要让索引空间过大,会影响插入性能。
索引优化
对于比较长的varchar类型的字段建索引,可以考虑建截断索引。截断长度覆盖80%的表数据即可。
索引未使用
对字段进行函数类操作也会导致无法使用索引。
索引匹配度问题
索引字段的重复率过高,导致查询匹配的行数过多
估计行数问题
由于更新删除比较多,数据库中的表的估计行数和实际行数已经不一致。这个时候需要对数据库的统计信息进行重新计算,主要是重新排列表的数据存储,减小碎片率。数据的存储空间会变少,查询性能也会有一定的提高。
mysql数据库的删除其实在数据底层,不是物理删除,是会先打一个删除标记。再通过其他进程来定时删除物理存储的。所以大批量的删除,是不能实时的减小表的空间的。
字段类型隐式转换
举例:查询时把int类型和varchar类型的数字关联错误,导致字段隐式转换
extend是varchar类型,不能用直接和int类型相等,会涉及到数据类型的隐式转换,导致无法使用索引,改写sql
使用主键进行查找
大批量的更新时尽量使用主键进行查找
尽量关联等式查询条件
这里cmd是否可以改成等于或者in条件,然后加上cmd索引就可以用上了。
倒序问题
低版本的mysql中,对索引字段的倒序排序,会导致无法有效使用索引,从正常的内存排序降级为文件排序了
唯一索引问题
对于唯一索引,需要判断是否需要,唯一索引对于插入的性能影响是最大的,每次单条插入都需要匹配全表查询唯一性。考虑具体业务规划,唯一性约束通过业务逻辑实现,将数据库端的唯一索引降级为普通的单列索引或者复合索引。
单表数据的重复调用问题
SELECT taskIDFROM daily_tasks
字段长度问题
SELECT idFROM fcm_token0WHERE imei = ?
0 条评论
回复 删除
下一页