繁体   English   中英

如何加快mysql正则表达式查询

[英]how to speed up mysql regex query

我想开发一个用于宣布职位的站点,但是因为我有很多条件(标题,类别,标签,城市..),所以我使用了MySQL regex语句。 但是,它非常慢,有时会导致500内部服务器错误

这是一个例子:

select * from job 
where 
( LOWER(title) REGEXP 'dév|freelance|free lance| 3eme   grade|inform|design|site|java|vb.net|poo ' 
or 
LOWER(description) REGEXP 'dév|freelance|free lance| 3eme grade|inform|design|site|java|vb.net|poo '
 or
 LOWER(tags) REGEXP 'dév|freelance|free lance| 3eme grade|inform|design|site|java|vb.net|poo') 
and 
LOWER(ville) REGEXP LOWER('Agadir') 
and 
`date`<'2016-01-11' 
order by `date` desc 

有什么建议吗?

您不能仅基于正则表达式来优化查询。 使用全文索引(或专用搜索引擎,例如Mnogo)进行文本搜索,并使用地理空间索引进行位置搜索。

WHERE的很大一部分,即3个REGEXPsOR不能优化。

LOWER(ville) REGEXP LOWER('Agadir')如果您的排序规则是..._ciLOWER(ville) REGEXP LOWER('Agadir')可以简单地转换为ville REGEXP 'Agadir' 请提供SHOW CREATE TABLE job

然后可以将其优化为ville = 'Agadir'

但是,也许此查询是由您的UI“生成”的? 并且允许用户使用正则表达式工具? (安全警告:此处可以进行SQL注入!)

如果是“生成”,则在没有正则表达式代码的情况下生成“ =”版本。

提供以下内容:

INDEX(ville, date) -- for cases when you can do `ville = '...'`
INDEX(date)        -- for cases when you must have `ville REGEXP '...'`

适当时将使用第一个(并且合理地最佳)。 第二总比没有好。 (这取决于具有该日期范围的行数。)

闻起来好像还有其他的SELECTs 让我们看看其他变种。 我在这里提供的内容可能对他们没有帮助。

见我的索引食谱: http : //mysql.rjweb.org/doc.php/index_cookbook_mysql

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM