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');

要执行全文搜索以匹配类别sometextdescription字段中的字符串,我运行以下命令:

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%操作(请注意,我并不是说 '%sometext%' 本身是有效的,但是使用由于复合 coving index 的类别 where 子句)。
  3. category梦想是在列和列上都有某种复合索引,name例如:CREATE FULLTEXT INDEX yippie ON item(category,name),但这当然是无效的

有谁知道使用 FULLTEXT 搜索实现#3 效果的方法(无需为每个类别创建单独的表)?

4

1 回答 1

0

更改表添加全文(类别,名称);

http://dev.mysql.com/doc/refman/5.6/en/alter-table.html

注意(在 InnoDB 中)如果你同时做这两个

MATCH (category) ...
MATCH (category, name)

那么你需要两者

FULLTEXT(category)
FULLTEXT(category, name)

如果您确实更改ft_min_token_size,请记住重建所有FULLTEXT索引。见innodb_optimize_fulltext_only

name LIKE '%some%'非常慢,因为它会扫描每一 name行中的每一个

如果category是一个数字,不要它放在任何FULLTEXT索引中。 category IN (2) AND MATCH...首先进行FULLTEXT搜索,然后按“类别”进一步过滤。这应该是足够有效的。

于 2015-08-21T03:54:26.523 回答