0

列id、name、およびUCIdを持つCompaniesテーブルを考えてみましょう。UCIdの数値部分が数字の文字列と一致する会社を見つけようとしています。

UCIは通常XY123456のように見えますが、ユーザー入力であり、ユーザーはランダムなスペースを残したり、XYに入らないこともあるので、そのままにしておきたいと考えています。私が言っているのは、標準的なパターンを強制することはできないということです。彼らはそれを自分たちのやり方で入力し、それを自分たちのやり方で読みたいと思っています。そのため、whereセクションで関数を使用する必要があります。

これらのクエリをmysqlで使用できないほど長くかからないようにする方法はありますか?使用する機能とそのすべてを知っているので、少なくとも比較的高速に検索を行う方法が必要です。UCIdにすでに適用されている関数を使用してカスタムインデックスを作成できますか?

参考までに、使用したいクエリの例

SELECT * 
FROM Companies 
WHERE digits_only(UCId) = 'some_digits.'

通常、Companiesテーブルには数万の行があり、場合によってはクエリを繰り返し実行する必要があることを付け加えておきます。そのため、高速なソリューションが必要です。

4

1 に答える 1

2

残念ながら、MySQL には関数 (一般的に言えば、式) ベースのインデックス ( OraclePostgreSQLのようなもの) はありません。考えられる回避策の 1 つは、表に別の列を追加することです。この列Companiesは、実際には正規化された値 (つまりdigits_only(UCId)) で埋められます。この列は、コードで、または INSERT/UPDATE に設定された DB トリガーを介して管理できます。

于 2012-10-19T14:20:47.497 に答える