0

我想开发一个发布工作的网站,但是因为我有很多条件(标题、类别、标签、城市..),所以我使用 MySQL 正则表达式语句。但是,它非常慢,有时会导致 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 

有什么建议吗?

4

2 回答 2

1

的很大一部分WHERE,即OR3的REGEXPs无法优化。

LOWER(ville) REGEXP LOWER('Agadir')ville REGEXP 'Agadir'如果您的排序规则是,则可以简单地变成..._ci. 请提供SHOW CREATE TABLE job

然后可以优化为ville = 'Agadir'.

但也许这个查询是由你的用户界面“生成”的?并且允许用户使用正则表达式?(安全警告:这里可以进行 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

于 2016-01-11T20:47:07.383 回答
1

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

于 2016-01-11T20:45:07.447 回答