一、實現功能
MySQL數據庫項目中使用,排除項目初期,項目運行中肯定會出現各種慢查詢的操作,需要優化。本文結合實際項目經驗,總結下SQL調優的思路。
二、實現步驟
1.定位需要優化SQL思路
1.業務慢:打時間日誌確認耗時的業務點(大多是由於SQL導致的)
2.MYSQL慢查詢日誌:慢查詢日誌,給where條件字段添加索引。
2.1查詢mysql慢查詢是否開啓相關配置
#查看慢查詢是否開啓,以及日誌
root@10.7.221.25 [(none)]> show variables like 'slow_query%';
+---------------------+-------------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/cloudera-01-slow.log |
+---------------------+-------------------------------------+
2 rows in set (0.00 sec)
#查看慢查詢設置臨界時間
root@10.7.221.25 [(none)]> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.100000 |
+-----------------+----------+
1 row in set (0.00 sec)
2.2 配置慢查詢
臨時配置
默認沒有開啓慢查詢日誌記錄,通過命令臨時開啓:
mysql> set global slow_query_log='ON';
Query OK, 0 rows affected (0.00 sec)
mysql> set global slow_query_log_file='/var/lib/mysql/instance-1-slow.log';
Query OK, 0 rows affected (0.00 sec)
mysql> set global long_query_time=2;
Query OK, 0 rows affected (0.00 sec)
永久配置
修改配置文件達到永久配置狀態:
/etc/mysql/conf.d/mysql.cnf
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/instance-1-slow.log
long_query_time = 2
配置好後,重新啓動 MySQL 即可。
2.3 查詢慢查詢日誌:查看慢查詢語句
[root@cloudera-02 ~]# cat /var/lib/mysql/cloudera-02-slow.log
/usr/sbin/mysqld, Version: 5.7.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
/usr/sbin/mysqld, Version: 5.7.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 2020-04-09T08:32:36.003677Z
# User@Host: root[root] @ [172.17.1.11] Id: 169
# Query_time: 0.100692 Lock_time: 0.000174 Rows_sent: 0 Rows_examined: 1
use infodt;
SET timestamp=1586421156;
DELETE FROM `bd_batch_file` WHERE `FILE_ID` = '581d8854b9e249ac9d2195f775cf0478';
/usr/sbin/mysqld, Version: 5.7.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
3.使用:explain確認執行行數
進而對需要的where條件字段添加索引
4.使用:force 強制指定索引
一個很好的實例 :利用 force index優化sql語句性能
因爲SQL會優化選擇認爲比較好的索引,但是,實際上可能並不是,所以,需要手動指定需要索引
三、總結
SQL多坑,一路走一路填。