0

MySQL データベースに 2 つのテーブルがあります。「結果」テーブルには最大 600 万行あり、値、ID、および別のテーブルの結果名の ID の 3 つが含まれています。「結果名」テーブルには、約 2000 行が含まれています。基本的に、結果名には、大きなテーブルの結果を説明する長い文字列が含まれています。

したがって、クエリを実行する場合は、2 つのテーブルを結合するだけなので、各結果の名前がわかります。

テーブルに参加しようとすると問題が発生します。このような結合またはサブクエリを実行すると、遅くなります (結合またはサブクエリにはほぼ同じ時間がかかります)。

mysql> select count(analysisresults_id) from analysis_results where result_nameid in (select resultname_id from analysis_resultnames where result_name like '%amygdala%');
+---------------------------+
| count(analysisresults_id) |
+---------------------------+
|                      6436 |
+---------------------------+
1 row in set (18.49 sec)

...しかし、サブクエリを個別に実行すると、わずかに高速になります。

mysql> select count(analysisresults_id) from analysis_results where result_nameid in (13,28);
+---------------------------+
| count(analysisresults_id) |
+---------------------------+
|                      6436 |
+---------------------------+
1 row in set (0.01 sec)

クエリ時間にこれほど大きな違いがあるのはなぜですか? また、サブクエリが通常の結合のように扱われるのはなぜですか?

4

3 に答える 3

1

最初にサブクエリを実行して、ID キーの使用を許可しないのはなぜですか? ですのでDEPENDENT SUBQUERY

サブクエリは実際には外側のクエリに依存していないように見えますが、MySQL はそれをそのまま扱います。複数の解決策がありますが、おそらく最も簡単な方法は、事前に ID を取得することです (既に行っているため)。WHEREまた、サブクエリと同じ句を使用できるようです。

于 2013-02-25T18:48:53.600 に答える
0

inMySQL は、サブクエリの最適化がうまくいかないことがあります。代わりにこれを試してください:

where exists (select 1
              from analysis_resultnames ar2
              where result_name like '%amygdala%' and
                    ar2.resultname_id = analysis_resultnames = resultname_id
             )

MySQLのドキュメントでは、相関関係のないサブクエリが 1 回だけ評価されることは明らかです。これは、元の定式化が完全なテーブル スキャンを実行することを意味します。これはかなりコストがかかります。この定式化では、インデックスを使用して数千の一致する行を取得する必要があります。追加のlike制約は、このサブセットにかなり迅速に適用されるはずです。

サブクエリとジョインについての質問は。データベース操作「結合」とキーワード「結合」を混同しています。SQL では、結合を表現する方法がいくつかあります。from節で「join」などのキーワードを使用するものもあります。whereand select(および even having) 句でサブクエリを使用するものもあります。

于 2013-02-25T18:51:33.717 に答える
0

文字列の一致にはコストがかかります。

%amygdala%

すべての値を完全に検索する必要があります(完全にということは、一致する場合は短絡できますが、一致しない場合は短絡できないことを意味します)

于 2013-02-25T18:48:40.747 に答える