过去几天,这一直是我的痛苦。我之前没有任何关于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
。
答案 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 ...
重点是在任何加入之前缩小结果集范围。