「explain」によって返される行がcount()と等しくないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1037471

  •  10-07-2019
  •  | 
  •  

質問

    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 によって生成された統計を検索します(状況によっては自動的に実行されます-たとえば、テーブル内の行が変更されました)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top