1. ホーム
  2. mysql

[解決済み] MySQLの "Can't reopen table "エラーの回避方法

2022-02-25 02:35:12

質問

現在、ある種のフィルタを実装していますが、フィルタリングするすべての"tag"について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

これは動作しますが、私は "search" テーブルを一時的なものにしたいのですが(通常のテーブルでない場合、数桁小さくすることができます)、これは非常に迷惑なエラーを発生させることになります。 Can't reopen table

いろいろ調べてみると このバグレポート しかし、MySQLの人々は、このような基本的な機能(テーブルを複数回使用する)が一時テーブルで機能しないことを気にしていないようです。私はこの問題で多くのスケーラビリティの問題にぶつかっています。

たくさんの一時的なテーブルを管理したり、すべてのデータを含む巨大なテーブルを維持する必要がないような、実行可能な回避策はないでしょうか?

Krisさん、よろしくお願いします。

[追加]。

GROUP_CONCATの回答は、私の状況では機能しません。私の条件は、特定の順序で複数の列であり、それは私がANDである必要があるものをORにしてしまうからです。しかし、以前の問題を解決するのに役立ったので、今では一時的であろうとなかろうと、テーブルは必要なくなりました。私たちの問題に対して、あまりにも一般的な考え方をしていただけなのです。フィルタの適用が、1分前後から1/4秒以下に短縮されたのです。

どのように解決するのか?

MariaDB (MySQL のフォーク) に切り替えることが可能であれば、バージョン 10.2.1 でこの問題は修正されています。 https://jira.mariadb.org/browse/MDEV-5535 .