2017-06-10 2 views
0

InnoDBテーブルにはvarchar列があり、最後の10文字のみを検索します。列全体にインデックスを作成して検索where right(mycol, 10) = p_searchを実行すると、インデックスは使用されません。最後の10文字の検索クエリでインデックスを使用するようなインデックスを作成する方法はありますか?私はMySQLが左の部分に索引を作成することを提供していることを理解していますが、この状況では機能しません。MySQLの列の右側部分にのみインデックスがあります

+0

2番目の列を作成し、最後の10文字をコピーし、最初の列ではなくその列にインデックスを付けますか?もちろん、列1を変更するすべてのコードも列2を更新する必要があります。 –

+0

5.7がない場合は、関心がある場合は、 'REVERSE()'を使用するkludgeがあります。 –

答えて

0

MySQL 5.7を使用している場合は、カラムの右側を含む生成カラムを追加してそのインデックスを作成できます。

ALTER TABLE yourTable 
    ADD newCol CHAR(10) AS (RIGHT(oldCol, 10)) STORED, 
    ADD INDEX (newCol); 

仮想列を使用するようにクエリを変更する必要はありません。 documentationは言う:

生成されたカラムがインデックス化されている場合、オプティマイザは列定義と一致するクエリ式を認識し、クエリが直接コラムを参照していない場合でも、クエリの実行中に、必要に応じて、カラムからインデックスを使用しています名前で。

したがって、WHERE RIGHT(oldCol, 10) = "abcdefghij"と書くと、オプティマイザはそれをWHERE newCol = "abcdefghij"のように扱い、インデックスを使用します。

古いバージョンを使用している場合は、これを実際の列として追加し、列が変更されるたびにトリガーを使用して更新することができます(実質的にはSTORED仮想列が自動的に行います)。しかし、この場合、新しい列をテストするためにクエリを変更する必要があります。

+0

そこにAlter Table Add Columnがありますか?私はテーブルを落としたくありません。構文エラーです。 –

+0

私は間違いを犯しました.'AS(RIGHT(mycol、10))STORED'の前にデータ型が必要です。これはALTER TABLEで動作します。 – Barmar

関連する問題