【发布时间】:2012-09-01 08:03:51
【问题描述】:
这个查询(用不同的名字代替“jack”)在我的慢查询日志中发生了很多次。为什么?
Users 表有很多字段(超过我选择的这三个)和大约 40.000 行。
select name,username,id from Users where ( name REGEXP
'[[:<:]]jack[[:>:]]' ) or ( username REGEXP '[[:<:]]jack[[:>:]]' )
order by name limit 0,5;
id 是主要且自动递增的。name 具有索引。username 具有唯一索引。
有时需要 3 秒! 如果我解释 MySQL 上的选择,我有这个:
select type: SIMPLE
table: Users
type: index
possible keys: NULL
key: name
key len: 452
ref: NULL
rows: 5
extra: Using where
这是我能做到的最好的吗?我能解决什么问题?
【问题讨论】:
-
试试
(name like '%jack%' and name REGEXP '[[:<:]]jack[[:>:]]' ) or ( username like '%jack%' and username REGEXP '[[:<:]]jack[[:>:]]' )。如果您需要更好的性能,请使用 FULLTEXT 索引或一些第三方工具。 -
正如@ImreL 建议的那样,如果您在 REGEXP 之前添加一个 LIKE %...% 子句,它本质上充当过滤器,以减少潜在结果的数量,然后再尝试 REGEXP。我发现这可以将 2 秒的慢查询缩短到 0.3 秒。
标签: mysql regex optimization indexing query-optimization