【发布时间】:2015-08-20 17:16:02
【问题描述】:
考虑下表:
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');
要执行全文搜索以匹配类别内description 字段中的字符串sometext,我运行以下命令:
SELECT i.id FROM item i
WHERE MATCH(i.description) AGAINST ('+sometext*' IN BOOLEAN MODE) AND category IN (2);
这很好用,直到表格变大(特别是因为我需要将最小索引词标记大小设置为 1 或 2)。
- 类别很多,行的分布在类别之间相当平均
- 使用非 FULLLTEXT 索引,您可以创建复合索引,如果您正在执行类似
SELECT i.id FROM item i WHERE category IN (2) AND name LIKE '%sometext%的操作,则可以像CREATE INDEX yippie ON item(category,name)这样更高效(注意,我并不是说 '%sometext%' 在本身,但由于复合 coving 索引,使用类别 where 子句的查询效率更高)。 - 梦想是在
category和name列中都有某种复合索引,例如:CREATE FULLTEXT INDEX yippie ON item(category,name),但这当然是无效的
有没有人知道使用 FULLTEXT 搜索(无需为每个类别创建单独的表)实现#3 效果的方法?
【问题讨论】:
标签: mysql indexing full-text-search fulltext-index