在/etc/my.cnf配置MySQL記錄慢查詢?nèi)罩荆?br>
[mysqld] slow_query_log=1 long_query_time=0.5 log_queries_not_using_indexes=1
查看慢查詢的相關配置:
mysql> show variables like '%slow%';
使用mysqldumpslow分析慢查詢?nèi)罩荆?br> 查看該命令的可用選項:
mysqldumpslow -h
找出平均查詢時間最長的5條記錄:
mysqldumpslow slow_query_log_file -s at -t 5
EXPLAIN
分析
table
: 顯示這一行的數(shù)據(jù)是關于哪張表的
type
: 顯示連接是使用了何種類型谎倔,從最好到最差的連接類型為:const
(主鍵查找)笋熬、eq_reg
(唯一索引谊惭、主鍵范圍查找)、ref
(基于索引查找)、range
(基于索引范圍查找)故慈、index
(對索引進行掃描)、all
。
possible_keys
: 該表中可能會使用的索引
key
: 實際使用的索引
key_len
: 索引長度(越短越好)
ref
: 顯示索引的哪一列被使用了(如果可能的話周崭,是一個常數(shù))
rows
: MySQL認為需要檢查表的數(shù)據(jù)的行數(shù)
extra
: 當該字段出現(xiàn)如下值: 1、Using filesort
喳张; 2续镇、Using temporary
時,表示SQL語句需要優(yōu)化销部。數(shù)據(jù)庫表結構優(yōu)化:
1摸航,使用可以存儲下數(shù)據(jù)的最小數(shù)據(jù)類型。
2舅桩,使用簡單的數(shù)據(jù)類型(盡量使用int
而不是varchar
)酱虎。
3,受限于InnoDB的存儲特性擂涛,盡可能的使用NOT NULL
定義字段读串。
4,為了提高查詢效率撒妈,減少查詢時需要掃描的范圍恢暖,盡量少用text
或blob
類型的字段,如果要用踩身,盡量把text
和blob
類型的字段放到單獨的表中胀茵。表的垂直拆分原則:
1,把不常用的字段單獨放到一個表中挟阻。
2琼娘,把大的字段單獨放到一個表中。
3附鸽,把經(jīng)常一起使用的字段放到一個表中脱拼。
percona-toolkit: 提供了很多實用的工具
檢查重復索引: pt-duplicate-key-checker -uroot -hlocalhost
慢查詢分析: pt-query-digest slow_query_log_file
-
innodb_stats_on_metadata
當啟用此變量時(這是默認情況,與創(chuàng)建該變量之前相同)坷备,InnoDB在元數(shù)據(jù)語句執(zhí)行期間更新統(tǒng)計數(shù)據(jù)熄浓,例如SHOW TABLE STATUS或SHOW INDEX,又或者當訪問INFORMATION_SCHEMA的表TABLES或STATISTICS時。 (這些更新與ANALYZE TABLE時發(fā)生的事情類似赌蔑。)當禁用時俯在,在這些操作期間InnoDB不會更新統(tǒng)計信息。禁用此變量可以提高有大量的表或索引的架構(schemas) 的訪問速度娃惯。它也可以提高涉及InnoDB表的查詢的執(zhí)行計劃的穩(wěn)定性跷乐。
set global innodb_stats_on_metadata=off;