次の表を検討してください。
CREATE TABLE `item` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
`category` smallint(11) unsigned NOT NULL,
`description` TEXT(500) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `category` (`category`),
FULLTEXT KEY `fulltextnameindex` (`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `item` (`id`, `category`, `description`)
VALUES
(1, 1, 'Nothing here for you'),
(2, 2, 'Still nothing here for you'),
(3, 2, 'this is sometext for you');
sometext
カテゴリ内のdescription
フィールド内の文字列と一致する全文検索を実行するには、次を実行します。
SELECT i.id FROM item i
WHERE MATCH(i.description) AGAINST ('+sometext*' IN BOOLEAN MODE) AND category IN (2);
これは、テーブルが巨大になるまでうまく機能します (特に、インデックス付き単語トークンの最小サイズを 1 または 2 にする必要があるため)。
- 多くのカテゴリがあり、行の分布はカテゴリ間でかなり均等です
- 非 FULLLTEXT インデックスを使用すると、これをより効率的にする複合インデックスを作成でき
CREATE INDEX yippie ON item(category,name)
ますSELECT i.id FROM item i WHERE category IN (2) AND name LIKE '%sometext%
。複合カバリング インデックスによるカテゴリ where 節)。 category
夢は、とname
列の両方にまたがるある種の複合インデックスを持つことです:CREATE FULLTEXT INDEX yippie ON item(category,name)
、しかしこれはもちろん有効ではありません
(カテゴリごとに個別のテーブルを作成せずに) FULLTEXT 検索を使用して #3 の効果を達成する方法を知っている人はいますか?