轉自:http://ourmysql.com/archives/1343
前段時間,一大早上,就收到報警,警告php-fpm程序的數量超過門檻值。最終發現是一條sql沒用到索引,導緻執行資料庫查詢慢了,最終導緻php-fpm程序數增加。最終通過analyze table feed_comment_info_id_0000 指令更新了Cardinality ,才能再次用到索引。
排查過程如下:
sql語句:
索引資訊:
通過explian檢視時,發現sql用的是主鍵PRIMARY,而不是obj_type索引。通過show index 檢視索引的Cardinality值,發現這個值是實際資料的兩倍。感覺這個Cardinality值已經不正常,是以通過analyzea table指令對這個值從新進行了計算。指令執行完畢後,就可用使用索引了。
Cardinality解釋
官方文檔的解釋:
An estimate of the number of unique values in the index. This is updated by running ANALYZE TABLE or myisamchk -a. Cardinality is counted based on statistics stored as integers, so the value is not necessarily exact even for small tables. The higher the cardinality, the greater the chance that MySQL uses the index when doing
總結一下:
1、它代表的是索引中唯一值的數目的估計值。如果是myisam引擎,這個值是一個準确的值。如果是innodb引擎,這個值是一個估算的值,每次執行show index 時,可能會不一樣
2、建立Index時(primary key除外),MyISAM的表Cardinality的值為null,InnoDB的表Cardinality的值大概為行數;
3、值的大小會影響到索引的選擇
4、建立Index時,MyISAM的表Cardinality的值為null,InnoDB的表Cardinality的值大概為行數。
5、可以通過Analyze table來更新一張表或者mysqlcheck -Aa來進行更新整個資料庫
6、可以通過 show index 檢視其值