最初に、最も重要なことを述べましょう。2 番目のクエリは、MySQL GROUP BY 拡張機能を使用しているため、有効な SQL クエリではありません。このMySQL拡張機能をオフにすると、
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
次に、次のようなエラーが表示されます。
ERROR 1463 (42000): non-grouping field 'id' is used in HAVING clause
したがって、このWHERE
句を実際に使用する必要があります。
しかし、今あなたの実際の質問に。あなたの測定値から、「id」フィールドにインデックスがあると思います。グループ化されたデータで動作する (動作するはず)ためHAVING
、使用できるインデックスはありません。ここには、約 120 万行の MySQL テーブルがあります。HAVING
インデックス付き整数フィールドに対するクエリは、最初の実行で 16 秒かかり、連続呼び出しでも約 0.6 秒かかりますが、 を使用したクエリでWHERE
はわずか 0.04 秒かかります。
を使用するEXPLAIN
と、MySQL はインデックスを使用しないことを通知します。
EXPLAIN SELECT id, title, resum FROM film HAVING id =56;
EXPLAIN
例として、私のテーブルに対するクエリの結果を次に示します。
mysql> EXPLAIN SELECT id, Title FROM `test` HAVING id = 4374354;
+----+-------------+----------+------+---------------+------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+---------+-------+
| 1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 1201750 | |
+----+-------------+----------+------+---------------+------+---------+------+---------+-------+
ご覧のとおり、「キー」フィールドには「NULL」と表示されており、インデックスが使用されていないことを示しています。代わりに、「rows」フィールドは、MySQL が 1201750 (すべて) 行をトラバースすることを示します。
mysql> EXPLAIN SELECT id, Title FROM `test` WHERE id = 4374354;
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | test | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
一方、EXPLAIN
forWHERE
は、「PRIMARY」インデックスを使用しているため、単一の行を読み取るだけでよいため、応答がはるかに高速になることがわかります。