我想优化此MySQL查询的性能
SELECT * FROM (
(SELECT * FROM users USE INDEX(names) WHERE name LIKE '%leo%') UNION
(SELECT * FROM users USE INDEX(names) WHERE name LIKE '%le%') UNION
(SELECT * FROM users USE INDEX(names) WHERE name LIKE '%eo%') UNION
(SELECT * FROM users USE INDEX(names) WHERE name LIKE '%l%') UNION
(SELECT * FROM users USE INDEX(names) WHERE name LIKE '%e%') UNION
(SELECT * FROM users USE INDEX(names) WHERE name LIKE '%o%')
) as A LIMIT 5 OFFSET 5;
字符串
我想要这样排序的值(leo,le,eo,l,e,o)
2条答案
按热度按时间k5ifujac1#
如果
LIKE
条件以%
开头,则无法真正优化LIKE
条件。索引是B树,因此搜索字符串必须与值的开头匹配,以便使用索引缩小搜索范围。您可以使用
OR
将WHERE
子句中的所有LIKE
条件合并组合起来,然后将每个条件放入ORDER BY
中。字符串
如果您可以从
LIKE
更改为=
,则可以将其简化为:型
2q5ifsrm2#
假设这些只是子字符串中的[可能]更长的名称,这是最快的,因为
WHERE
子句比其他建议更快。字符串
LIKE
比REGEXP
在同等测试中更快。遗憾的是,ORDER BY
无法优化。