3

これを行うクエリがあります:

SELECT `threaded_comments`.* FROM `threaded_comments` WHERE `threaded_comments`.`parent_id` IN (4, 5)

また、parent_id 列に INDEX を設定しました。

クエリで EXPLAIN SELECT チェックを実行すると、次の情報が得られます。

`select_type`,`table`,`type`,`possible_keys`,`key`,`key_len`,`ref`,`rows`,`Extra`
'SIMPLE', 'threaded_comments', 'ALL', 'COMMENT_PARENT', NULL, NULL, NULL, 3, 'Using where'

インデックスの where 句にキーが使用されていないようです。ただし、単純なparent_id = 4を実行すると機能します。しかし、parent_id=4 または parent_id=5 を実行すると、同じメッセージが表示されます。

innoDB データベースのテーブル タイプと関係があることがわかりました。その特定のデータベース エンジンで実行される IN 操作がある場合、MySQL はそれを好まないようです。これは EXPLAIN ツールの問題でしょうか、それとも InnoDB に欠けているものでしょうか?

4

3 に答える 3

4

いいえ、InnoDBとは何の関係もありません。EXPLAINプランは、クエリがインデックスを使用できることを示していますが、MySQLオプティマイザはそれを使用しないことを決定しました。選択される決定は、多くの要因によって異なります。しかし、後でテーブルが大きくなったときに、オプティマイザーが有用であると判断した場合、オプティマイザーは別の決定を下すことができます。そのクエリで明示的にインデックスを使用したい場合は、インデックスを強制しようとすることができます。

于 2011-08-20T22:25:47.103 に答える
1

インデックスは必ずしもメリットではありません。

ドキュメントから:

各テーブルインデックスが照会され、テーブルスキャンを使用する方が効率的であるとオプティマイザが判断しない限り、最適なインデックスが使用されます。かつては、最適なインデックスがテーブルの30%を超えているかどうかに基づいてスキャンが使用されていましたが、固定パーセンテージでは、インデックスとスキャンのどちらを使用するかを決定できなくなりました。オプティマイザーはより複雑になり、テーブルサイズ、行数、I/Oブロックサイズなどの追加の要因に基づいて見積もりが行われます。

あなたの場合、インデックスは問題ないと見なされますparent_id = 4が、テーブルスキャンが推奨されますparent_id IN (4, 5)

于 2011-08-20T22:26:15.777 に答える
1

テーブル内の行が少なすぎるようで、フルスキャンが望ましいです。

于 2011-08-20T22:01:56.003 に答える