【问题标题】:Covering / Composite Indexes with MySQL FULLTEXT使用 MySQL FULLTEXT 覆盖/复合索引
【发布时间】: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)。

  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 子句的查询效率更高)。
  3. 梦想是在categoryname 列中都有某种复合索引,例如:CREATE FULLTEXT INDEX yippie ON item(category,name),但这当然是无效的

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

【问题讨论】:

    标签: mysql indexing full-text-search fulltext-index


    【解决方案1】:

    ALTER TABLE ADD FULLTEXT(category, name);

    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 搜索,然后按“类别”进一步过滤。这应该是足够有效的。

    【讨论】:

    • category 是一个整数外键。如果您进行了category IN (2) AND MATCH..,您仍在进行匹配,则对匹配结果进行全面扫描以过滤category。在我的情况下,这个结果集非常大,所以我希望在进行全文搜索之前或之后按类别过滤,如果它是 FT 索引的一部分——这似乎是不可能的
    • 我认为在MATCH...之前使用INDEX(categoery)是不可能的
    • 我同意,我认为 MySQL 的全文索引是有限的,而且由于只能在一个表上使用单个索引,如果选择全文索引,则无法进行进一步优化。
    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多