【问题标题】:Rlike MariaDB Query slowRlike MariaDB 查询慢
【发布时间】:2018-08-19 04:56:24
【问题描述】:

我有一个查询,我对结果感到满意,但不是因为查询的性能,我想从文本中选择一些词(不允许部分词)(即我想选择:“dog”而不是“dogs ")

SELECT name FROM texts WHERE name rlike '[[:<:]]text[[:>:]]' LIMIT 0, 50;

我用“like '% text %'”测试了相同的选择,速度要快得多,但没有正确选择单词边界作为“文本”。 (以.结尾)或以!开头,句子开头,......有太多的可能性......

有什么方法可以改进/修改我的查询并获得相同的结果?

谢谢

【问题讨论】:

  • 您应该查看全文索引:mariadb.com/kb/en/library/full-text-index-overview
  • name like '%text%' and name rlike '[[:&lt;:]]text[[:&gt;:]]' 怎么样?第一个条件是多余的,但可能会提高性能。
  • 全文索引的问题在于拆分虚线词,即“知名”搜索 (well,known) 而不仅仅是“众所周知”如何纠正?

标签: mysql sql performance mariadb


【解决方案1】:
WHERE MATCH(name) AGAINST('well-known' IN BOOLEAN MODE)
  AND RLIKE '[[:<:]]well-known[[:>:]]'

FULLTEXTLIKE 快; LIKERLIKE 快。

问题在于FULLTEXT 的例外情况(短词、停用词等)。如果可行,让您的应用查看搜索词来决定使用 FULLTEXT AND 技巧还是使用 Paul 的 LIKE AND 技巧。

迟缓的原因...在您的原始查询(仅RLIKE)中,必须读取每一行,并且必须扫描每个name 以查找“文本”。

FULLTEXT 更快(也许快得多),因为它可以使用索引直接转到带有“文本”的行。

LIKERLIKE 更快,因为算法不那么复杂。 (但它仍然必须获取每个name。)

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2016-03-23
    • 2019-09-29
    • 1970-01-01
    • 2022-01-04
    • 2020-11-21
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多