MySQLのcardinality異常の簡単な解析

2480 ワード

この間、朝からアラームが鳴り、php-fpmプロセスの数がしきい値を超えたことを警告しました.最終的にsqlがインデックスを使用していないことが判明し、データベースクエリの実行が遅くなり、php-fpmプロセス数が増加しました.最終的にanalyze table feed_を通過comment_info_id_0000コマンドはCardinalityを更新してから、インデックスを再利用することができます.チェック・プロセスは次のとおりです:sql文:

select id from feed_comment_info_id_0000 where obj_id=101 and type=1;


インデックス情報:

show index from feed_comment_info_id_0000
+---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| feed_comment_info_id_0000 | 0 | PRIMARY | 1 | id   | A | 6216 | NULL | NULL |   | BTREE | | 
| feed_comment_info_id_0000 | 1 | obj_type | 1 | obj_id | A | 6216 | NULL | NULL |   | BTREE | | 
| feed_comment_info_id_0000 | 1 | obj_type | 2 | type  | A | 6216 | NULL | NULL | YES | BTREE | | 
| feed_comment_info_id_0000 | 1 | user_id | 1 | user_id | A | 6216 | NULL | NULL |   | BTREE | | 
+---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
5 rows in set (0.00 sec)


explianで確認したところ、sqlはobj_ではなくプライマリキーPRIMARYを使用していることがわかりました.typeインデックス.show indexでインデックスのCardinality値を表示すると、この値は実際のデータの2倍であることがわかります.この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で1枚のテーブルまたはmysqlcheck-aaを更新してデータベース全体を更新することができ、show indexでその値を表示することができる