如何优化这个mysql查询的性能?

oug3syen  于 2024-01-05  发布在  Mysql
关注(0)|答案(2)|浏览(137)

我想优化此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)

k5ifujac

k5ifujac1#

如果LIKE条件以%开头,则无法真正优化LIKE条件。索引是B树,因此搜索字符串必须与值的开头匹配,以便使用索引缩小搜索范围。
您可以使用ORWHERE子句中的所有LIKE条件合并组合起来,然后将每个条件放入ORDER BY中。

SELECT *
FROM users
WHERE name LIKE '%leo%' OR name LIKE '%le%' OR name LIKE '%eo%' OR 
    name LIKE '%l%' OR name LIKE '%e%' OR name LIKE '%o%'
ORDER BY name LIKE '%leo%' DESC, name LIKE '%le%' DESC, name LIKE '%eo%' DESC, 
    name LIKE '%l%' DESC, name LIKE '%e%' DESC, name LIKE '%o%' DESC
LIMIT 5 OFFSET 5;

字符串
如果您可以从LIKE更改为=,则可以将其简化为:

SELECT *
FROM users
WHERE name in ('leo', 'le', 'eo', 'l', 'e', 'o')
ORDER BY FIELD(name, 'leo', 'le', 'eo', 'l', 'e', 'o')
LIMIT 5 OFFSET 5;

2q5ifsrm

2q5ifsrm2#

假设这些只是子字符串中的[可能]更长的名称,这是最快的,因为WHERE子句比其他建议更快。

SELECT *
    FROM users
    WHERE name REGEXP "[leo]"
    ORDER BY name LIKE '%leo%' DESC,
             name LIKE '%le%' DESC,
             name LIKE '%eo%' DESC, 
             name LIKE '%l%' DESC,
             name LIKE '%e%' DESC,
             name LIKE '%o%' DESC;

字符串
LIKEREGEXP在同等测试中更快。遗憾的是,ORDER BY无法优化。

相关问题