0

簡単な SQL リクエストがあります。

SELECT id, title, resum
FROM film
WHERE id = 56 ;

このリクエストの応答時間は、ほぼ 0.0009 秒です。

一方、同じクエリで、Having Clause を使用すると、次のようになります。

SELECT id, title, resum
FROM film
HAVING id =56 ;

最初の要求 (0.0049 秒) と比較して、このような大きな応答時間を与えます。

最初のリクエストはより最適化されていますが、なぜですか? この大きな違いの理由を教えてください。

よろしくお願いします。

4

1 に答える 1

1

最初に、最も重要なことを述べましょう。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 |       |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+

一方、EXPLAINforWHEREは、「PRIMARY」インデックスを使用しているため、単一の行を読み取るだけでよいため、応答がはるかに高速になることがわかります。

于 2013-09-30T11:17:00.223 に答える