107

私は現在、フィルタリングするすべての「タグ」に対して INNER JOIN 句を生成する必要がある種類のフィルターを実装するのに忙しいです。

問題は、大量の SQL を実行した後、選択に必要なすべての情報を含むテーブルを作成したことですが、生成された INNER JOIN ごとに再びテーブルが必要になることです。

これは基本的に次のようになります。

SELECT
    *
FROM search
INNER JOIN search f1 ON f1.baseID = search.baseID AND f1.condition = condition1
INNER JOIN search f2 ON f2.baseID = search.baseID AND f2.condition = condition2
...
INNER JOIN search fN ON fN.baseID = search.baseID AND fN.condition = conditionN

これは機能しますが、「検索」テーブルを一時的なものにすることをお勧めします(通常のテーブルでない場合は、数桁小さくなる可能性があります)が、非常に厄介なエラーが発生します。Can't reopen table

いくつかの調査により、このバグ レポートにたどり着きましたが、MySQL の人々は、そのような基本的な機能 (テーブルを複数回使用する) が一時テーブルで機能しないことを気にしていないようです。この問題で多くのスケーラビリティの問題に直面しています。

潜在的に多くの一時的であるが非常に現実的なテーブルを管理する必要がない、またはすべてのデータを含む巨大なテーブルを維持する必要がない実行可能な回避策はありますか?

よろしく、 クリス

[追加]

私の条件は特定の順序で複数の列であるため、GROUP_CONCATの回答は私の状況では機能しません。ANDにする必要があるものからORを作成します。ただし、以前の問題を解決するのに役立ったので、一時テーブルであるかどうかにかかわらず、テーブルは不要になりました。私たちは、問題に対して一般的すぎると考えていました。フィルターの適用全体が、約 1 分から 4 分の 1 秒未満に短縮されました。

4

8 に答える 8

143

簡単な解決策は、一時テーブルを複製することです。テーブルが比較的小さい場合にうまく機能します。これは一時テーブルの場合によく見られます。

于 2013-01-28T10:27:59.517 に答える
51

そうです、MySQLのドキュメントTEMPORARYには、「同じクエリでテーブルを複数回参照することはできません」と書かれています。

同じ行を検索する別のクエリを次に示します。一致する行のすべての条件が別々の列に含まれるわけではありませんが、コンマで区切られたリストに含まれます。

SELECT f1.baseID, GROUP_CONCAT(f1.condition)
FROM search f1
WHERE f1.condition IN (<condition1>, <condition2>, ... <conditionN>)
GROUP BY f1.baseID
HAVING COUNT(*) = <N>;
于 2008-12-07T06:03:11.813 に答える
4

MariaDB (MySQL のフォーク) への切り替えが可能な場合、この煩わしさはバージョン 10.2.1 で修正されています: https://jira.mariadb.org/browse/MDEV-5535

于 2020-05-25T05:31:53.877 に答える
3

個人的には、恒久的なテーブルにするだけです。これらのテーブル用に別のデータベースを作成することもできます (おそらく、これらのクエリの多くを一度に実行できるため、一意の名前が必要になるでしょう)。また、アクセス許可を適切に設定できるようにすることもできます (データベースにアクセス許可を設定できます。テーブルのワイルドカードにパーミッションを設定しないでください)。

次に、古いものを時々削除するためのクリーンアップ ジョブも必要になります (MySQL はテーブルが作成された時刻を便利に記憶しているため、クリーンアップが必要なときにそれを使用することができます)。

于 2008-12-07T07:55:12.773 に答える
1

ここに画像の説明を入力

この問題に関する MYSQL ドキュメントは次のとおりです。上記のいくつかの回答のように、重複した一時テーブルを使用していますが、CTE が適切な状況が発生する可能性があります。

https://dev.mysql.com/doc/refman/8.0/en/temporary-table-problems.html

于 2020-01-27T19:32:25.720 に答える
0

クエリを永続テーブルに変更することができ、これで修正されました。(MicroStrategyのVLDB設定、一時テーブルタイプを変更しました)。

于 2009-06-19T17:44:15.210 に答える