1

次の表を検討してください。

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 にする必要があるため)。

  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 節)。
  3. category夢は、とname列の両方にまたがるある種の複合インデックスを持つことです: CREATE FULLTEXT INDEX yippie ON item(category,name)、しかしこれはもちろん有効ではありません

(カテゴリごとに個別のテーブルを作成せずに) FULLTEXT 検索を使用して #3 の効果を達成する方法を知っている人はいますか?

4

1 に答える 1