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

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

我想优化此MySQL查询的性能

  1. SELECT * FROM (
  2. (SELECT * FROM users USE INDEX(names) WHERE name LIKE '%leo%') UNION
  3. (SELECT * FROM users USE INDEX(names) WHERE name LIKE '%le%') UNION
  4. (SELECT * FROM users USE INDEX(names) WHERE name LIKE '%eo%') UNION
  5. (SELECT * FROM users USE INDEX(names) WHERE name LIKE '%l%') UNION
  6. (SELECT * FROM users USE INDEX(names) WHERE name LIKE '%e%') UNION
  7. (SELECT * FROM users USE INDEX(names) WHERE name LIKE '%o%')
  8. ) as A LIMIT 5 OFFSET 5;

字符串
我想要这样排序的值(leo,le,eo,l,e,o)

k5ifujac

k5ifujac1#

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

  1. SELECT *
  2. FROM users
  3. WHERE name LIKE '%leo%' OR name LIKE '%le%' OR name LIKE '%eo%' OR
  4. name LIKE '%l%' OR name LIKE '%e%' OR name LIKE '%o%'
  5. ORDER BY name LIKE '%leo%' DESC, name LIKE '%le%' DESC, name LIKE '%eo%' DESC,
  6. name LIKE '%l%' DESC, name LIKE '%e%' DESC, name LIKE '%o%' DESC
  7. LIMIT 5 OFFSET 5;

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

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

展开查看全部
2q5ifsrm

2q5ifsrm2#

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

  1. SELECT *
  2. FROM users
  3. WHERE name REGEXP "[leo]"
  4. ORDER BY name LIKE '%leo%' DESC,
  5. name LIKE '%le%' DESC,
  6. name LIKE '%eo%' DESC,
  7. name LIKE '%l%' DESC,
  8. name LIKE '%e%' DESC,
  9. name LIKE '%o%' DESC;

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

相关问题