【问题标题】:improve performance for LIKE clause提高 LIKE 子句的性能
【发布时间】:2012-10-29 00:00:16
【问题描述】:

在过去的几天里,这一直让我头疼。我之前创建了数据库,对LIKE 的性能一无所知。我使用的查询是这样的,

SELECT  ....
FROM    .... JOINS ....
WHERE   tableA.col1 LIKE '%keyword%' OR
        tableB.col2 LIKE '%keyword%' OR
        tableC.col2 LIKE '%keyword%' OR
        .....

当我测试查询时,它非常快,因为它只有大约 100-150 条记录。我想搜索包含关键字的任何字符串。几个月过去了,该数据库变得庞大,包含 50,000 条记录。而这一次,我已经体验到了查询的低性能。它非常低。

有什么建议可以改进吗?我无法更改数据库,因为它已被公司使用。

顺便说一句,我的桌子都是INNODB

【问题讨论】:

  • 那是全表扫描...外部搜索引擎怎么样?
  • 也许你的表格布局需要改变,以避免这样的慢查询。
  • 嗨@KarolyHorvath。外部搜索引擎是什么意思?

标签: mysql sql


【解决方案1】:

这种类型的搜索称为Full Text Search,您确实需要为此使用专门的系统,而不是强制数据库不断进行表扫描。您基本上将要搜索的所有文本都交给搜索引擎,然后搜索引擎将其编入索引以便快速搜索。

一个选项是Apache Lucene

【讨论】:

  • 它将如何应用于我当前的场景?我必须修改我的数据库的结构还是什么?我非常需要这个:(
  • @DerekFloss Np​​,您将不理会当前数据库。相反,您将安装一个新的软件 tp 处理全文搜索,如 Lucene。然后,您需要编写一些代码,将您想要搜索的所有文本导入 Lucene,然后更改现有代码以使用 Lucene 进行这些搜索。
  • @Chris 你有完整的教程吗?
  • 只有我用谷歌找到的:javacodegeeks.com/2010/05/…
【解决方案2】:

使用通配符前缀'%abc' 很可能会停止使用任何索引。

无索引 = 全表扫描 =(通常)慢...

顺便说一句,50,000 条记录并不多;它很小。

你考虑过使用MySql的Full-Text Search Functions吗? (需要 MyISAM 表)

【讨论】:

  • 全文索引只能用于 MyISAM 表
  • 全文不支持INNODB?
  • @DerekFloss:没有。目前,您还没有支持全文搜索的 MySQL 事务引擎。然而,这将随着即将发布的 5.6 版而改变
【解决方案3】:

如果你不能像其他朋友提到的那样使用全文搜索,有一个SQL优化点可以改善你的查询:

SELECT  ....
FROM    (SELECT * FROM tableA WHERE col1 LIKE '%keyword%') A JOIN 
        (SELECT * FROM tableB WHERE col2 LIKE '%keyword%') B ON ... JOIN
        (SELECT * FROM tableC WHERE col2 LIKE '%keyword%') C ON ...

关键是在任何加入之前缩小结果集。

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 2011-09-18
    • 2013-05-21
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2012-08-01
    相关资源
    最近更新 更多