数据库优化
前言:相信大部分人对数据库的基本概念都有一定的了解,前面文章也对数据库及事务做了一定的介绍,现在就来讲讲数据库优化
一、为什么要进行数据库优化
1.避免网站页面出现访问错误:
避免因为数据库连接超时而使系统出现异常;
由于慢查询导致页面午无法加载;
由于阻塞无法提交事务。
2.增加数据库的稳定性
3.优化用户体验
二、数据库优化可以从以下几个方面入手:
1.SQL及索引优化
2.数据库表结构优化
3.系统配置优化
4.硬件配置优化
以上四个方面,优化的成本从下而上逐渐增高,而优化的效果会逐渐降低。
三、具体实现方法
1.SQL及索引优化:
开启慢日志是否开启:
show variables like ‘slow_query_log’;
±---------------±------+
| Variable_name | Value |
±---------------±------+
| slow_query_log | OFF |
±---------------±------+
1 row in set (0.00 sec)
开启慢日志:
set global slow_query_log=on;
监听日志文件
tail -f /var/lib/mysql/mysql-slow.log
1.1 MySQL慢查日志分析工具(pt-query-digest)
1.安装步骤请自行百度,这里不加以赘述。
基本命令:
2.查看服务器信息:man pt-summary
3.查看磁盘开销使用信息: pt-diskstats
4.分析慢查询日志:pt-query-digest /var/lib/mysql/mysql-slow.log
5、查找mysql的从库和同步状态:
pt-slave-find --host=localhost --user=root --password=123456
6.查看死锁信息:
pt-deadlock-logger --user=root --password=123456 localhost
7.从慢查询日志中分析索引使用情况:
[[email protected] ~]# pt-index-usage --user=root --password=123456 localhost /var/lib/mysql/mysql-slow.log
localhost does not exist or is not readable at /usr/bin/pt-index-usage line 4447.
ALTER TABLE sakila
.actor
DROP KEY idx_actor_last_name
; – type:non-unique
ALTER TABLE sakila
.film
DROP KEY idx_fk_original_language_id
, DROP KEY idx_title
; – type:non-unique
ALTER TABLE sakila
.staff
DROP KEY idx_fk_address_id
; – type:non-unique
8.查找数据库中农重复的索引:
pt-duplicate-key-checker --host=localhost --user=root --password=123456
9、查看mysql表和文件的当前活动IO开销
[[email protected] ~]# pt-ioprofile
Fri Oct 26 02:14:17 CST 2018
Tracing process ID 37860
total filename
[[email protected] ~]#
10.查找数据库里大于2G的表:
pt-find --user=root --password=123456 --tablesize +2G
11.查找10天前创建,MyISAM引擎的表:
pt-find --user=root --password=123456 --ctime +10 --engine MyISAM
12.查看表和索引大小并排序:
pt-find --user=root --password=123456 --printf “%T\t%D.%N\n” | sort -rn
13.杀掉显示查询时间大于60秒的查询:
pt-kill --user=root --password=123456 --busy-time 60 --kill
13、查看mysql授权:
pt-show-grants --user=root --password=123456
14、验证数据库复制的完整性:
pt-table-checksum --user=root --password=123456
二.、如何通过慢查日志发现有问题的SQL
1、查询次数多且每次查询占用时间长的sql
通常为pt-query-digest分析的前几个查询;该工具可以很清楚的看出每个SQL执行的次数及百分比等信息,执行的次数多,占比比较大的SQL
2、IO大的sql
注意pt-query-digest分析中的Rows examine项。扫描的行数越多,IO越大。
3、未命中的索引的SQL
注意pt-query-digest分析中的Rows examine 和Rows Send的对比。说明该SQL的索引命中率不高,对于这种SQL,我们要重点进行关注。
三、通过explain查询分析SQL的执行计划:
SQL的执行计划侧面反映出了SQL的执行效率,在执行的SQL前面加上explain关键词即可
说明:
Count(id)是不包含null的值
Count(*)是包含null的值