Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 提高LIKE子句的性能_Mysql_Sql - Fatal编程技术网

Mysql 提高LIKE子句的性能

Mysql 提高LIKE子句的性能,mysql,sql,Mysql,Sql,这几天我头上一直很痛。我以前创建过数据库,但对LIKE的性能一无所知。我使用的查询是这样的 SELECT .... FROM .... JOINS .... WHERE tableA.col1 LIKE '%keyword%' OR tableB.col2 LIKE '%keyword%' OR tableC.col2 LIKE '%keyword%' OR ..... 当我测试这个查询时,速度非常快,因为上面只有大约100-150条

这几天我头上一直很痛。我以前创建过数据库,但对
LIKE
的性能一无所知。我使用的查询是这样的

SELECT  ....
FROM    .... JOINS ....
WHERE   tableA.col1 LIKE '%keyword%' OR
        tableB.col2 LIKE '%keyword%' OR
        tableC.col2 LIKE '%keyword%' OR
        .....
当我测试这个查询时,速度非常快,因为上面只有大约100-150条记录。我想搜索任何包含关键字的字符串。几个月过去了,数据库变得庞大,包含50000条记录。这一次,我已经体验到了查询的低性能。非常低

有什么建议可以改进吗?我不能更改数据库,因为它已经被公司使用过了


顺便说一下,我的表都是
INNODB

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

无索引=完整表扫描=(通常)缓慢

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


你考虑过使用MySql吗?(需要MyISAM表)

这种类型的搜索是调用,您确实需要使用专门的系统来进行搜索,而不是强制数据库不断地进行表扫描。从理论上讲,你可以将所有想要搜索的文本交给搜索引擎,然后由搜索引擎为其编制索引以进行快速搜索


一个选项是。

如果您不能像其他朋友提到的那样使用全文搜索,那么有一个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 ...

关键是在任何联接之前缩小结果集的范围。

这是一个完整的表扫描。。。外部搜索引擎怎么样?也许你的表格布局需要改变,以避免如此缓慢的查询。hi@KarolyHorvath。外部搜索引擎是什么意思?全文索引只能与MyISAM表一起使用全文索引不支持
INNODB
?@DerekFloss:不支持。目前您没有支持全文搜索的MySQL事务性引擎。然而,这将随着即将发布的5.6版本而改变,它将如何应用于我当前的场景?我必须修改数据库的结构吗?我非常需要这个:(@DerekFloss Np,您将不使用当前数据库。相反,您将安装一个新的软件tp handle全文搜索,如Lucene。然后,您需要编写一些代码,将所有要搜索的文本导入Lucene,然后更改现有代码以使用Lucene进行这些搜索。@Chris您有全文搜索吗这方面的教程?只有我在谷歌上找到的: