mysql慢查询排查处理

1.mysql优化的目的

            事务阻塞,慢查询

2.mysql优化的方向

             sql及索引优化。 

             数据库表结构,根据数据设计查询最优的表结构。

            系统配置优化,对打开文件数和安全的限制。 

            硬件,选择最适合数据库的cpu,更快的IO,更大的内存,cpu不是越多越好, IO并不能减少锁的机制,也就是不能减少阻塞,所以说硬件的优化成本越高,效果最差。

3.mysql慢查询日志的开启

          slow_query_log           

          show_query_log_file:慢查日志存储位置

                  set global slow_query_log_file="D:/Program Files/mysql-5.6.44-winx64/loglocalhost-slow.log";

           log_queries_not_use_indexes:是否把没有使用索引的查询记录在文件中

           long_query_time:超过多少秒的查询记录下来

#开启慢查询日志记录
mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.00 sec)


#查询时间超过0.1秒的sql语句会被记录
mysql> set global long_query_time=0.1;
Query OK, 0 rows affected (0.03 sec)


#记录慢查询日志的文件地址
mysql> set global slow_query_log_file="/var/lib/mysql/localhost-slow.log";
Query OK, 0 rows affected (0.04 sec)


#记录没有使用索引的查询
mysql> set global log_queries_not_using_indexes=on;
Query OK, 0 rows affected (0.00 sec)
 

show variables like 'slow_query_log';

show variables like 'long_query_time';

show variables like 'slow_query_log_file';

show variables like 'log_queries_not_using_indexes';

4.mysql慢查询日志存储格式

          1.mysqldumpslow(mysql官方自带的,安装的时候就带有)

          2.mysqldumpslow -t 3 /home/mysql/data/mysql-slow.log  | more(输出排名前三的查询慢的日志)

          3.-s (可以规定慢查询日志以什么方式排序展示)

# Time: 190617 11:07:00
# User@Host: root[root] @ localhost [::1]  Id:    25
# Query_time: 0.001000  Lock_time: 0.001000 Rows_sent: 7  Rows_examined: 17
SET timestamp=1560740820;
SELECT a.name,a.subject,b.children from teachers a left join father b on a.name=b.name
   union
   select b.name,a.subject,b.children from teachers a right join father b on a.name=b.name;

4.mysql自带命令mysqldumpslow分析慢查询

mysqldumpslow是perl命令,需要搭建对应的环境后才能运行

perl环境搭建:https://www.runoob.com/perl/perl-environment.html

mysqldumpslow -t 3 D:\Program Files\mysql-5.6.44-winx64\loglocalhost-slow.log | more

详细使用:https://www.cnblogs.com/bean-sprout/p/7590766.html

 

5.pt-query-digest使用

详细使用:http://www.php.cn/mysql-tutorials-357655.html

下载地址:wget http://www.percona.com/downloads/percona-toolkit/2.2.4/percona-toolkit-2.2.4.tar.gz

 

 

关注点

 

6.explain分析单一sql的执行效率

各列参数含义:https://www.jianshu.com/p/8fab76bbf448

const:一般是主键,唯一索引之类的常数查找;eq_reg范围查找

 

 

 

https://blog.youkuaiyun.com/johnstrive/article/details/46437547

演示

下载演示数据库网址:https://dev.mysql.com/doc/index-other.html

查看数据库表结构网址:https://dev.mysql.com/doc/sakila/en/sakila-installation.html

 

 

 

 

 

 

### 如何排查 MySQL 中的慢查询问题并进行性能优化 #### 1. 使用慢查询日志定位问题 MySQL 提供了慢查询日志功能,可以记录执行时间超过指定阈值的 SQL 查询语句。通过分析这些日志,能够快速找到潜在的性能瓶颈[^2]。 启用慢查询日志的方式如下: ```sql -- 设置全局变量开启慢查询日志 SET GLOBAL slow_query_log = 'ON'; -- 指定慢查询日志文件路径 SET GLOBAL slow_query_log_file = '/var/log/mysql/slow-query.log'; -- 设定慢查询的时间阈值(单位:秒) SET GLOBAL long_query_time = 2; ``` #### 2. 分析慢查询日志中的具体问题 可以通过 `mysqldumpslow` 工具或者第三方工具(如 pt-query-digest)来解析慢查询日志,找出最耗时或频率最高的查询语句。 示例命令: ```bash mysqldumpslow -s t /var/log/mysql/slow-query.log ``` 上述命令按查询时间排序展示慢查询日志的内容。 #### 3. 针对慢查询的具体优化措施 ##### (1) 减少不必要的数据请求 检查应用程序是否只获取所需的字段和记录,而不是使用 `SELECT *` 或加载过多无关的数据。 ##### (2) 添加合适的索引 对于频繁使用的查询条件,应确保其对应的列已建立索引。如果未加索引,则可能导致全表扫描,显著降低查询效率[^3]。 例如,假设有一张名为 `orders` 的表,经常基于 `customer_id` 和 `order_date` 进行过滤操作,则可为其联合建索引: ```sql CREATE INDEX idx_customer_order ON orders(customer_id, order_date); ``` ##### (3) 避免在索引列上应用函数 当查询条件涉及对索引列的应用函数时,可能会导致索引失效。因此建议改写SQL逻辑以保持原生索引可用性。 比如下面这个例子中,原本可以直接利用索引加速匹配过程,但由于增加了日期转换函数而破坏了这一优势: ```sql WHERE DATE(order_date) = '2023-09-01' -- 不推荐做法 ``` 改为显式范围表达形式即可恢复高效检索能力: ```sql WHERE order_date >= '2023-09-01' AND order_date < '2023-09-02' ``` ##### (4) 处理子查询与连接查询 复杂的嵌套结构往往成为数据库负载的主要来源之一。针对这类情况可以从以下几个方面入手改进: - **重写为JOIN**:某些情况下将子查询替换为等价联接关系可能带来更好的表现效果; - **拆解大事务**:把单条庞大的多步计算分割成若干独立的小单元分别提交处理; - **引入中间结果集缓存机制**:预先计算好部分固定不变的结果保存下来供后续重复调用减少实时运算开销. ##### (5) 考虑分区技术 随着数据规模持续增长单纯依赖传统索引已经难以满足高性能需求此时可以考虑采用水平分片策略即将一张巨型表格划分为更小粒度的部分各自单独管理从而达到提升访问速率的目的. 另外还需注意的是有时候即使做了以上所有努力仍然无法彻底解决问题那么就需要重新审视整个架构设计看是否有其他替代方案可供选择比如说调整存储引擎类型从MyISAM切换到InnoDB等等. #### 4. 利用EXPLAIN分析执行计划 为了进一步确认某个特定SQL的实际运行状况我们还可以借助于内置诊断指令explain来进行深入剖析查看其中涉及到的各种细节参数以便采取更有针对性的技术手段加以改善: ```sql EXPLAIN SELECT ... ; ``` 此命令返回的信息包括但不限于所选算法种类、参与节点数量估计值以及预计I/O成本等方面内容有助于开发者全面掌握当前状态下各项资源消耗分布规律进而制定合理的改造方针. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值