【问题标题】:adding FULLTEXT index : didn't make much difference , is it going to index older data?添加 FULLTEXT 索引:没有太大区别,它会索引旧数据吗?
【发布时间】:2013-12-12 21:30:21
【问题描述】:

我有一个使用like 条件的查询,它正在杀死我的服务器 (这个查询是我在慢查询日志中经常得到的) 顺便说一句,我的表有大约 120k 行 - 请忽略语法错误

select * from `images` where `category` like `%,3,%` and ( `tags` like '%,tag1,%' or `tags` like '%,tag2,%' or `tags` like '%,tag3,%' or `tags` like '%,tag4,%')

我现在不想更改查询和数据库设计,所以我决定切换到 myisam 并为tags 列使用全文索引。

之后的服务器负载并没有太大变化,mysql 仍然不时使用高达 90% 的 cpu(诅咒 8 个中的 1 个)。

所以我很奇怪,这个全文索引......它会索引旧数据(在添加这个索引之前)吗?因为它发生得非常快,而且我的桌子有点大。

或者它只适用于新存储的数据?

【问题讨论】:

    标签: mysql indexing myisam full-text-indexing


    【解决方案1】:

    现有数据已编入索引,但根据 Pyrce 的建议,使用 LIKE %[token]% 的查询无法利用全文索引。

    像这样重写你的条件,这完全等同于你的初始查询(忽略stopwords and the likes):

    WHERE MATCH(tags) AGAINST ('tag1 tag2 tag3 tag4' IN BOOLEAN MODE)
    

    但是,您应该专注于规范化您的结构。在字段中存储非标量值(例如逗号分隔值)违反了 first normal form

    新建image_tag表,与images建立1-N关系。常规索引将允许即时查询。

    CREATE TABLE image_tags (
        image_id INT,
        tag VARCHAR(50),
        PRIMARY KEY (image_id, tag),
        FOREIGN KEY (image_id) REFERENCES images(id), -- replace with "images" table's actual primary key
        KEY(tag, image_id) -- this index may be superfluous, check EXPLAIN
    );
    
    SELECT images.*
    FROM images
    JOIN image_tags ON image_id = images.id
    WHERE tag IN ('tag1', 'tag2', 'tag3', 'tag4');
    

    images.category 重复。

    【讨论】:

      【解决方案2】:

      全文索引通常只有助于标记前缀匹配。换句话说,tags 列的每一行中的所有非字母数字加下划线分隔的单词(除了 A-Z、0-9 或 _ 之外的任何分隔单词 - 请参阅 here)都将被索引以查找前缀匹配。然后您必须使用MATCH (tags) AGAINST ('tag1') 来匹配全文索引搜索。您可以为每个标签重复这些匹配以获取完整的查询。一旦您完全配置了匹配查询,执行Explain 查询将告诉您查询构建器是否正在使用您的索引。

      不幸的是,MySQL 在更改全文索引/搜索的方式上相当有限——所以你大多坚持使用它的默认搜索方法(全文搜索模式有两种——请参阅docs)。

      【讨论】:

      • 对不起,我已经更新了查询..标签用,分隔...所以你的说法为了全文有效,我必须使用 => 像 '%,tag1 这样的标签,' ?
      • 很明显,在调查了这个问题之后,MySQL 在这个领域的能力远不及 Postgres……见makandracards.com/makandra/…。您需要将行更改为不使用 , 分隔符或将 C 插件写入 MySQL(不建议)。我会更新我的答案。
      猜你喜欢
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      相关资源
      最近更新 更多