質問があります:
select SQL_NO_CACHE id from users
where id>1 and id <1000
and id in ( select owner_id from comments and content_type='Some_string');
(問題を表す、私のスフィンクスのインデックス作成に使用される実際の大きなクエリが不足していることに注意してください) このクエリには約3.5秒かかります(id = 1..5000から範囲を変更すると約15秒になります)。
ユーザーテーブルには約35000エントリがあり、コメントテーブルには約8000エントリがあります。
上記のクエリについて説明します。
explain select SQL_NO_CACHE id from users
where id>1 and id <1000
and id in ( select distinct owner_id from d360_core_comments);
| id | select_type | テーブル| タイプ| possible_keys | キー| key_len | ref | 行| エクストラ|
| 1 | プライマリ| ユーザー| 範囲| プライマリ| プライマリ| 4 | NULL | 1992 | whereを使用する; インデックスの使用|| 2 | 依存サブクエリ| d360_core_comments | すべて| NULL | NULL | NULL | NULL | 6901 | whereを使用する; 一時的な使用|
ここで、個々のsubquery(select owner_id from d360_core_comments where content_type='Community20::Topic';
)はほぼ0.0秒かかります。
ただし、owner_id、content_typeにインデックスを追加すると、(ここでの順序に注意してください)
create index tmp_user on d360_core_comments (owner_id,content_type);
私のサブクエリは、インデックスを使用せずに約0.0秒でそのまま実行されます。
mysql> Explain select owner_id from d360_core_comments where content_type ='Community20 :: Topic';
| id | select_type | テーブル| タイプ| possible_keys | キー| key_len | ref | 行| エクストラ|
| 1 | シンプル| d360_core_comments | すべて| NULL | NULL | NULL | NULL | 6901 | whereを使用する|
しかし今、私のメインクエリ(select SQL_NO_CACHE id from users where id>1 and id <1000 and id in ( select owner_id from d360_core_comments where content_type='Community20::Topic');
)は次の説明で〜0秒で実行されます:
mysql> Explain select SQL_NO_CACHE id from users where id> 1 and id <1000 and id in(select owner_id from d360_core_comments where content_type ='Community20 :: Topic');
| id | select_type | テーブル| タイプ| possible_keys | キー| key_len | ref | 行| エクストラ|
| 1 | プライマリ| ユーザー| 範囲| プライマリ| プライマリ| 4 | NULL | 1992 | whereを使用する; インデックスの使用|| 2 | 依存サブクエリ| d360_core_comments | index_subquery | tmp_user | tmp_user | 5 | func | 34 | whereを使用する|
したがって、私が持っている主な質問は次のとおりです。
- サブクエリで使用されるテーブルで定義されたインデックスが実際のサブクエリで使用されていない場合、ここでクエリをどのように最適化していますか?
- そして、そもそも、実際のサブクエリとメインクエリが独立してはるかに高速であるのに、最初のクエリに非常に時間がかかったのはなぜですか?