你无法真正优化以 %
开头的 LIKE
条件。索引是B树结构,因此搜索字符串必须与值的开头匹配才能通过索引缩小范围。
可以将 WHERE
子句中的所有 LIKE
条件用 OR
连接起来,并将每个条件放入 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;
```