1. 程式人生 > >MYSQL優化(八)

MYSQL優化(八)

MYSQL慢日誌
show variables like ‘slow_query_log’;檢視是否開啟慢日誌
show variables like ‘%log%’;檢視所有日誌開啟情況
set global log_queries_not_using_indexes=on;開啟記錄使用索引的查詢
show variables like ‘long_query_time’;查詢時間以上的訪問記錄在日誌中
set global slow_query_log=on;//開啟慢日誌

慢日誌內容
1,執行SQL的主機資訊
2,SQL的執行資訊
3,SQL執行時間
4,SQL的內容

慢日誌分析工具
1,mysqldumpslow -h幫助命令 SQL安裝自帶 +日誌檔案目錄 | more
2,pt-query-digest slow-log > slow_log_report 輸出到檔案
pt-query-digest show.log -review \ h=127.0.0.1,D=test,p=root.P=3306,u=root,t=query_review \
–create-reviewtable \ –review-history t=hostname_show 輸出到資料庫表
關注優化的SQL
1.查詢次數多且每次查詢佔用時間長的SQL
通常為pt-query-digest分析的前幾個查詢
2.IO大的SQL,資料庫的主要瓶頸就在於IO
注意pt-query-digest分析中的Rows examine項。掃描行數多,佔用io大
3.未命中索引的SQL
注意pt-query-digest分析中Rows examine(掃描行數)和Rows send(傳送行數)的對比
如果這個比值比較大,說明索引命中率不高

explain查詢SQL的執行計劃判斷查詢效率
Max()優化CREATE INDEX 建立索引
COUNT()優化會忽略NULL值需要加 COUNT(‘a’ = ‘1’ OR NULL)

子查詢優化->join連結的方式
若是一對多關係使用DISTINCT去重複

GROUP BY 優化利用子查詢過濾條件後分組之後再內連結

LIMIT分頁優化
1,使用主鍵ORDER BY操作
2,記錄上次返回的主鍵,在下次查詢時使用主鍵過濾(此列必須資料連續的id,通過where限定查詢範圍)

索引優化
選擇合適的索引列
1.在where,group by,order by,on從句中出現的列
2.索引欄位越小越好(因為資料庫的儲存單位是頁,一頁中能存下的資料越多越好 )
3.離散度大得列放在聯合索引前面
select count(distinct customer_id), count(distinct staff_id) from payment;數值越大離散度越高,優先在前面
冗餘索引重複索引檢視工具pt-duplicate-key-checker
刪除不用索引pt-index-usage -uroot -p ” mysql-slow.log 大量慢日誌分析

選擇合適的資料型別
1.使用可存下資料的最小的資料型別
2.使用簡單地資料型別,Int要比varchar型別在mysql處理上更簡單
3.儘可能使用not null定義欄位,這是由innodb的特性決定的,因為非not null的資料可能需要一些額外的欄位進行儲存,這樣就會增加一些IO。可以對非null的欄位設定一個預設值
4.儘量少用text,非用不可最好分表,將text欄位存放到另一張表中,在需要的時候再使用聯合查詢,這樣可提高查詢主表的效率
例子1、用Int儲存日期時間
from_unixtime()可將Int型別的時間戳轉換為時間格式
select from_unixtime(1392178320); 輸出為 2014-02-12 12:12:00
unix_timestamp()可將時間格式轉換為Int型別
select unix_timestamp(‘2014-02-12 12:12:00’); 輸出為1392178320
例子2
儲存IP地址——bigInt
利用inet_aton(),inet_ntoa()轉換
select inet_aton(‘192.169.1.1’); 輸出為3232301313
select inet_ntoa(3232301313); 輸出為192.169.1.1

表結構優化
1,正規化化
避免冗餘資料,方便多表單獨增刪改差(類別等)
2,反正規化化
使用冗餘減少多表連結,加快查詢效率
3,垂直拆分
把不常用的欄位單獨存放到一個表中
把大欄位獨立存放到一個表中
把經常一起使用的欄位放到一起
4,水平拆分
一個表中的資料太多,分多表結構不變

MYSQL配置檔案
my.ini
1,記憶體大小 innodb_buffer_pool_size >= 1024 MB(75%)
2,緩衝池個數 innodb_buffer_pool_instances = 1
3,緩衝大小 innodb_log_buffer_size 日誌每秒重新整理不用太大
4,資料重新整理時間預設1,建議2效能,安全1 innodb_flush_log_at_trx_commit = 1
5,讀寫IO程序數 innodb_read_io_threads = 4 innodb_write_io_threads = 4
6,獨立表空間 innodb_file_per_table = ON
7,重新整理表統計資訊 innodb_stats_on_metadata = OFF
第三方配置工具
https://tools.percona.com/wizard