提高LIKE子句的性能

时间:2012-10-29 00:00:16

标签: mysql sql

过去几天,这一直是我的痛苦。我之前没有任何关于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

3 个答案:

答案 0 :(得分:1)

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

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

顺便说一句,有50,000个记录不是很大;它很小。

您是否考虑过使用MySql的Full-Text Search Functions? (需要MyISAM表)

答案 1 :(得分:1)

这种类型的搜索是调用Full Text Search,你真的需要使用专门的系统,而不是强迫数据库不断进行表扫描。您将所有想要搜索的文本切换到搜索引擎,然后将其编入索引以便快速搜索。

一个选项是Apache Lucene

答案 2 :(得分:0)

如果您不能像其他朋友那样使用全文搜索,那么可以使用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 ...

重点是在任何加入之前缩小结果集范围。