「explain」によって返される行がcount()と等しくないのはなぜですか?
質問
mysql> select count(*) from table where relation_title='xxxxxxxxx';
+----------+
| count(*) |
+----------+
| 1291958 |
+----------+
mysql> explain select * from table where relation_title='xxxxxxxxx';
+----+-------------+---------+-
| id | select_type | rows |
+----+-------------+---------+-
| 1 | SIMPLE | 1274785 |
+----+-------------+---------+-
" explain select * from table from relation_title = 'xxxxxxxxx';" relation_title = 'xxxxxxxxx'の行をインデックスで返します。しかし、実際の数値よりも小さいです。
解決
結果を取得するために実行した行数を示しています。
間違ったデータの理由は、EXPLAINが正確ではなく、テーブルについて保存されている情報に基づいてデータについて推測することです。
これは非常に有用な情報です。たとえば、多くのテーブルでJOINSを実行する場合、各行の1行の情報について、結合されたテーブル全体を実行しないようにする必要があります。
608行のテーブルでのテストです。
SELECT COUNT(id) FROM table WHERE user_id = 1
結果:
COUNT(id)
512
そして説明はこちら
EXPLAIN SELECT COUNT(id) FROM table WHERE user_id = 1
結果:
id rows
1 608
他のヒント
EXPLAIN
クエリは、 INFORMATION_SCHEMA
テーブルで提供される値を使用します。このテーブルには、innodbテーブルの行カウントの大まかな推定値が含まれます- INFORMATION_SCHEMA.TABLESのmysqlドキュメント。
ANALYZE TABLE table_name;
を実行-EXPLAINが使用する統計を更新し、正しい数値を取得します。たとえば、テーブルにデータがまったくない場合、EXPLAINはこのテーブルが空であることを提案し、そのテーブルに基づいて最初にフィルター処理するクエリを最適化します(ディスク、メモリなどから何も読み取らないため)。その後、 ANALYZE TABLE table_name;
を実行しない場合にデータがロードされるとき、オプティマイザーはまだテーブルが空であることを提案し、クエリに最適な実行プランを使用しません。 EXPLAINは同じように動作します-テーブル内の現在の行数を検索せず、 ANALYZE TABLE table name
によって生成された統計を検索します(状況によっては自動的に実行されます-たとえば、テーブル内の行が変更されました)。