考虑下表:
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%
操作(请注意,我并不是说 '%sometext%' 本身是有效的,但是使用由于复合 coving index 的类别 where 子句)。 category
梦想是在列和列上都有某种复合索引,name
例如:CREATE FULLTEXT INDEX yippie ON item(category,name)
,但这当然是无效的
有谁知道使用 FULLTEXT 搜索实现#3 效果的方法(无需为每个类别创建单独的表)?