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