mysql 慢查詢 慢SQL 記錄和調整


在mysql 中,可以通過設置配置參數,開啟慢 SQL 的記錄

在 my.cnf 的 [mysqld] 配置下,可以設置以下參數實現慢查詢記錄

# 啟用記錄慢SQL 功能
slow_query_log=1
# 設置超過 1 秒的SQL 為慢SQL
long_query_time=1
# 將慢SQL 的信息保存 table 中
log_output=table

NOTE:

log_output 參數默認為:file,代表保存在文件中

如果設置了將慢SQL 保存在 table中,默認就是保存於 mysql.slow_log 表,默認的建表語句如下:

CREATE TABLE `slow_log` (
  `start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `user_host` mediumtext NOT NULL,
  `query_time` time(6) NOT NULL,
  `lock_time` time(6) NOT NULL,
  `rows_sent` int(11) NOT NULL,
  `rows_examined` int(11) NOT NULL,
  `db` varchar(512) NOT NULL,
  `last_insert_id` int(11) NOT NULL,
  `insert_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `sql_text` mediumblob NOT NULL,
  `thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'

將慢SQL 日志設置為全局查看

這里可以抖一個機靈,將這個 slow_log 的表保存於 SequoiaDB中,這樣就實現了全局共享。

首先將 my.cnf 中的 slow_query_log 設置為0(關閉記錄慢SQL 的功能),重啟了mysql 后,進入mysql shell,將 mysql.slow_log 表刪除,然后再創建為 SequoiaDB 的表

drop table mysql.slow_log;
CREATE TABLE `slow_log` (
  `start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `user_host` mediumtext NOT NULL,
  `query_time` time(6) NOT NULL,
  `lock_time` time(6) NOT NULL,
  `rows_sent` int(11) NOT NULL,
  `rows_examined` int(11) NOT NULL,
  `db` varchar(512) NOT NULL,
  `last_insert_id` int(11) NOT NULL,
  `insert_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `sql_text` mediumblob NOT NULL,
  `thread_id` bigint(21) unsigned NOT NULL
) ENGINE=SEQUOIADB DEFAULT CHARSET=utf8 COMMENT='Slow log'

然后再此修改 my.cnf 配置,重啟mysql 后,以后mysql 的慢SQL 信息都會保存於SequoiaDB 存儲引擎中,這樣全局所有的mysql 節點看到的都是相同的慢SQL 了。

mysql 記錄DDL 和 DML的方式

臨時設置開啟記錄 DDL和DML 操作

set global log_output='table';
set global general_log=on;
關閉記錄的步驟
set global general_log=off;

永久性打開的方式,直接修改 my.cnf 配置文件中 [mysqld] 的配置,然后重啟mysql 服務

log_output=table
general_log=1

逆天改命 -- 騷操作

在關閉 general_log=off 設置下,將 mysql.general_log 表重建到 sequoiadb 引擎中,操作方法

use mysql;
drop table general_log;
CREATE TABLE `general_log` (
  `event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `user_host` mediumtext NOT NULL,
  `thread_id` bigint(21) unsigned NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumblob NOT NULL
) ENGINE=SEQUOIADB DEFAULT CHARSET=utf8 COMMENT='General log';

如果所有服務器上的mysql 都做同樣的操作,則所有的機器都可以看到相同的、執行過的DDL和DML 操作了。

mysql 分析SQL 利器

很多朋友在mysql 中,分析一個SQL時,都是采用簡單的 explain 方法,但是這種方法只能夠查看訪問計划,對於mysql 底層的數據交互的時間消耗,無法做到進一步的分析,好在mysql 自帶了一個SQL執行效率分析功能,它就是

show profiles;

設置啟用方法

SET profiling=1;

這個SQL 分析功能,當然不止這些功能,你可以通過它,查看一個SQL 在各個階段的消耗,還有服務器資源的消耗,例如:選擇查看 query 1 在各個執行階段的消耗

查看query 1 對服務器的資源消耗

關閉這個功能也非常簡單

SET profiling=0;

mysql 運維建議

關於mysql 的日常運維,網上的資料非常多,適合自己的才是最重要。
但是對於我個人而已,我認為想mysql 的slow query 功能,是建議打開的,原因有二
1 slow query 對於mysql 的消耗不算很大
2 slow query 的啟用和關閉,只能夠重啟生效,對於在線業務影響非常大

而對於全面記錄mysql 的DDL 和DML 操作的方法,還有記錄每個sql 的執行效率的方法,我個人是建議日常關閉,等到出現了慢查詢了,或者需要對系統做更加深度的檢查時,才臨時打開,畢竟這兩個功能對mysql 自身消耗太大。如果你希望有更好的性能,那樣這兩個功能日常還是要關閉的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM