SQL優化
一、SQL優化簡介
- 解釋:對於特定的要求,使用更有的SQL策略或索引策略,以達到讓結果呈現的時間更短,從而提升操作效率的過程就是SQL優化。
- SQL優化包含在數據庫級別優化中。我們平常所說的SQL優化就是指優化SQL語句和索引。
- SQL優化是伴隨業務而進行優化的,並不是下面的所有操作都必須都達到才是最好的優化。
二、常規調優思路(眾多解決方案之一)
- 查看slow-log,分析slow-log,分析出查詢慢的語句。
- 按照一定優先級,進行一個一個的排查所有慢語句。
- 分析top sql,進行explain調試,查看語句執行語句。
- 調整索引或語句本身。
MySQL日志支持
一、MySQL5.7中日志分類
MySQL日志分類四類:錯誤日志(回滾等)、二進制日志(主從)、通用查詢日志(記錄查詢等信息)、慢查詢日志
二、通用查詢日志
- 通用查詢日志是記錄建立的客戶端連接和執行的語句
- 通過show variables like '%version%';查看版本信息
- 可以通過show variables like '%general%'查看通用查詢日志是否卡開啟 general_loh 屬性取值
-
- OFF 表示關閉(默認關閉)
-
- ON 表示打開

- 通過查看日志輸出格式
-
- File存儲在數據庫的數據文件中的主機名.log
C:\ProgramData\MySQL\MySQL Server 5.7\Data
- File存儲在數據庫的數據文件中的主機名.log
-
- TABLE 存儲在數據庫中的mysql/general_log
- 臨時開啟/關閉通用日志(重啟失效)
# 開啟 set global general_log = on; # 關閉 set global general_log = off;
- 臨時設置輸出格式(重啟失效)
# mysql/general_log set global log_output-'TABLE'; # 主機名-slow.log set global log_output='FILE'; # 兩者都輸出 set global log_output='FILE,TABLE';
- 永久設置。修改MySQL配置文件
- windows中日志文件在C:\ProgramData\MySQL\MySQL Server 5.7\my.ini中。
- 按需配置

- 配置后重啟MySQL服務
- 日志文件中時間和系統時間不一致問題
- 查看系統日志文件格式
show variables like '%log_timestamps%';
- 修改日志文件時間格式為系統時間
set global log_timestamps = SYSTEM
三。錯誤日志
- MySQL錯誤日志記錄MySQL運行過程中較為嚴重的警告和錯誤信息,以及MySQL啟動和關閉的詳細信息。以及MySQL每次啟動和關閉的詳細信息。
- 通過show variables like '%log_error%';查看
- binlog_error_action 錯誤處理方式
- ABORT_SERVER出現問題終止服務
- IGNORE_ERROR忽略錯誤
- log_error錯誤日志文件名及路徑
- log_error_verbosity記錄級別
- 取值1表示記錄警告信息
- 大於1表示所有警告信息都記錄
- 日志文件可以通過文本編輯器打開。
四、二進制日志
- 包含所有更新數據(新增、刪除、修改、改表等)SQL信息的記錄。
- MySQL主從配置就依賴這個日志文件
- 通過show variables like '%log_bin%';查看二進制日志

- 二進制日志不可以通過修改全局參數開啟。全局匹配值問下(my.ini)中該參數是注釋的。
# binary Logging # log-bin
直接設置log-gin的值為日志文件名。
# Binary Logging log-gin=mylogbin
設置后重啟MySQL服務會發現log_bin參數值為ON
- 開啟后二進制文件存儲在C:\ProgramData\MySQL\MySQL Server 5.7\Data。里面有個xxx.index文件(這個文件成為二進制文件索引)里面存儲了所有二進制文件清單。當重啟MySQL服務或過一定時間后會自動生成一個二進制文件。增加的二進制文件編號遞增。也可以使用flush logsl命令生成一個新的二進制文件。
- 也可以通過命令:show binary log;查看目前生成的日志文件。
- 由於是二進制文件,所以無法直接使用文本編輯器打開,需要借助工具才可以看見。
- 在navicat或sql命令中輸入
mysql show binlog events in 'mylogbin.000003';
- 在命令行輸入,借助mysqlbinlog工具
- 輸入命令式要在日志文件所在文件夾路徑中運行,也可以在命令中寫上日志文件全路徑
- D:/a.sql可以沒有,沒有表示直接大隱刀控制台
mysql mysqlbinlog mylogbin.000003 > D:/a.sql
- binlog中除了刪除IAO創建表的SQL都是加密的,如果希望看見可以使用下面命令
- 直接打印到控制台會出現中文亂碼
mysql mysqlbinlog -base64-output=deode-rows -v mysqlbin.000003 > D:/a.sql
五、慢查詢日志
- 記錄所有執行時間超過long_query_time秒的所有查詢或不適用於索引的查詢
- long_query_time默認時間為10秒。即超過10秒的查詢都認為是慢查詢
- 慢查詢日志默認名稱:住進-slow.log
- 除了查看my.ini文件以外通過show variables like '%query%';查看

-
- slow_query_log 表示是否開啟慢查詢日志。(默認開啟)
-
- slow_query_log_file 慢查詢日志文件名
-
- long_query_time慢查詢閾值設置,查處為慢查詢。此值直接設置全局參數可能無效,建議測試直接修改配置文件。
-
- log_queries_not_using_index是否記錄不適用於索引的查詢(前提是slow_query_log開啟)
-
- 可以通過命令查看慢查詢日志中慢查詢SQL命令的個數。也可以使用文本編輯器直接打開慢查詢日志文件。也可以查看mysql.slow_log表中的額數據(前提log_output值包含table)
show status like '%slow_queries%';
