【问题标题】:How to speed up search MySQL? Is fulltext search with special characters possible?如何加快搜索MySQL?可以使用特殊字符进行全文搜索吗?
【发布时间】:2016-01-10 18:51:18
【问题描述】:

我的 VARCHAR InnoDB 表列中有如下字符串:

"This is a {{aaaa->bbb->cccc}} and that is a {{dddd}}!"

现在,我想搜索例如{{xxx->yyy->zzz}}。括号是字符串的一部分。有时与另一个列一起搜索,但它只包含一个普通的 id,因此不需要考虑(我猜)。

我知道我可以使用 LIKE 或 REGEXP。但是这些(已经尝试过的)方法太慢了。我可以引入全文索引吗?或者我应该添加另一个帮助表?我应该替换特殊字符{}-> 来获取全文搜索的单词吗?或者我还能做什么?

搜索可以处理大约一万行,我假设我经常得到大约一百次点击。

【问题讨论】:

    标签: mysql indexing full-text-search


    【解决方案1】:

    此链接应该为您提供有关 MySQL 中 FULLTEXT 索引的所有信息。

    MySQL dev site

    您需要特别注意的部分是:

    "全文搜索使用 MATCH() ... AGAINST 语法执行。MATCH() 采用逗号分隔的列表来命名要搜索的列。AGAINST 采用要搜索的字符串和一个可选修饰符指示要执行的搜索类型。搜索字符串必须是在查询评估期间保持不变的字符串值。这排除了例如表列,因为每行的列可能不同。"

    因此,简而言之,要回答您的问题,您应该通过在宽 VARCHAR 列上实施全文索引来缩短查询执行时间。 如果您使用的是兼容的存储引擎(InnoDB 或 MyISAM)

    这里还有一个示例,说明如何查询全文索引以及问题中暗示的附加 ID 字段:

    SELECT * 
    FROM table 
    WHERE MATCH (fieldlist) AGAINST ('search text here') 
        AND ( field2= '1234');
    

    【讨论】:

    • 上述特殊字符有问题吗?这就是为什么我认为这是不可能的。
    • 你不应该这样做,只要它们是有效的 VARCHAR 字符。此处提供了完整的限制,但根据我的经验和阅读此页面,它们不应该成为问题dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html
    • 如果表中有值abc 则不起作用,我搜索{{abc}}。这是一个错误的匹配。括号也必须存在于值中。
    • 我以为这就是您想要的结果?您可以尝试使用全引号 "" 中的搜索文本以二进制模式进行搜索吗?
    • 不幸的是,不是。我需要完全匹配。布尔模式也无济于事。我认为 fts 被认为是真实的单词,而不是像正则表达式那样带有任何字符的字符串。
    猜你喜欢
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2013-04-02
    • 2016-05-30
    • 2011-06-08
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多