正規表現の一致により、クエリが短くなります(よりきれいになるのはオブザーバーの問題です)が、最も効率的ではありません。
Sashi Kantへのコメントを見て、検索しているテキストがコンマで区切られた属性のセットであると推測できますか?あなたが書いた:big,novel,graphic novel
。いつもそうですか?
もしそうなら、繰り返しますが、それでも効率的ではありませんが、それでも管理が簡単です、書くことです
SELECT * FROM table
WHERE FIND_IN_SET('novel', tags) > 0
ソリューション、正規表現ソリューション、およびソリューションの間で共有されているのは、どちらも列FIND_IN_SET
のインデックスを利用できないということです。tags
すべてのクエリは、列に対して何らかの関数を使用しており、インデックスの使用を無効にします。
パフォーマンスが必要で、データ形式が私が思うとおりである場合は、テーブルを正規化することをお勧めします。次のような新しいテーブルを作成しますknown_tag
。
CREATE TABLE known_tag (
known_tag_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(127) CHARSET ascii
);
(独自のデータ型を選択してください)
そして、次のような多対多の接続テーブル。
CREATE TABLE original_table_to_known_tag (
original_table_id INT UNSIGNED,
known_tag_id INT UNSIGNED,
PRIMARY KEY(original_table_id, known_tag_id),
KEY(known_tag_id)
);
そして最後に、次のようにクエリを実行します。
SELECT
table.*
FROM
known_tag
JOIN original_table_to_known_tag USING (known_tag_id)
JOIN original_table USING (original_table_id)
WHERE
known_tag.name = 'novel'
;
このタイプのクエリは適切なインデックスを使用し、大きなテーブルでより効率的になります。