提高 MySQL 效能之常用技巧
基準測試工具:
http_load
sysbench
查看錶相關操作:
show create table [table_name];
describe [table_name];
show table status like [table_name];
查詢技巧:
select articID, GROUP_CONCAT(type) from Articstocktotal GROUP BY articID;(彙總之後,字串方式連線type列)
記錄慢查詢日誌:
set slow_query_log=ON;
long_query_time=0;(記錄所有查詢,單位毫秒)
開啟執行語句查詢:
set profiling=ON;
檢視所有已經記錄下來的查詢(查詢的 id 及 耗時):
show profiles;
根據查詢的 id 顯示查詢的具體操作耗時:
show profile for query [query_id];
以上語句可以確定每個查詢的執行具體耗時.
分頁查詢延遲關聯技巧:
select * from [table_name] t_a left join [select id from [table_name] [where [conditions]] limit [start, length] ];
以上語句主要是先根據條件和分頁查詢出id,這樣資料庫引擎會快速的剔除不符合條件的id,從而達到提高效能的目的(不用將全部資料載入).
檢視查詢生成的臨時表等:
flush status;
show status where variable_name like '%create%' or variable_name like '%handler%';
檢視索引資訊:
show index from [table_name];
cardinalty(基數)表示索引列有多少不同的取值,MyIASA精準,InnoDB估算.innodb_stats_sample_pages變數用來控制InnoDB取樣的索引頁數(預設8),一旦使用以上語句就會觸發統計資訊的更新,MySQL客戶端或監控程式也會不時觸發統計資訊的更新,這樣會造成伺服器的壓力,尤其是資料特別大的時候.
analyze table [table_name];(手動分析統計資訊)
innodb_stats_on_metadata 引數用來控制因MySQL客戶端或者監控程式觸發的統計資訊更新.
innodb_stats_persistent 引數用來控制是否持久化統計資訊.
索引碎片:
行碎片,行間碎片,剩餘空間碎片
MyISAM 會全部出現,可以通過 optimize table [table_name] 或者 匯出再匯入資料重新整理資料.
InnoDB 不會出現短小的行碎片,因為他會移動短小的行並重寫到一個新的片中,InnoDB 可以通過刪除再重建索引的方式來消除碎片.
對於不支援 optimize table [table_name] 指令的引擎,可以通過 alter table [table_name] engine=[origin_engine] 的方式,不做任何操作來重新建表,標準版本的 MySQL 可能只會重建聚簇索引.