欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库优化

程序员文章站 2022-06-02 12:27:47
...

前言:相信大部分人对数据库的基本概念都有一定的了解,前面文章也对数据库及事务做了一定的介绍,现在就来讲讲数据库优化
一、为什么要进行数据库优化
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的值