为什么我的查询不使用任何索引?

时间:2017-08-04 15:29:06

标签: mysql sql indexing

这是我的问题:

select u.*,
       concat(user_fname, ' ', user_lname) like concat(?, '%') `both`,
       user_lname like ? last_name
from users u 
where concat(user_fname, ' ', user_lname) like concat(?, '%')
   or user_lname like concat(?, '%')
order by `both`*2 DESC, last_name

我还有两个索引:users(user_fname,user_lname)users(user_lname)

以下是EXPLAIN的结果:

id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra
1  | SIMPLE      | u     | ALL  | user_lname    | NULL | NULL    | NULL | 9    |  Using where

请参阅?它不使用任何索引。为什么?以及如何使查询最佳?

1 个答案:

答案 0 :(得分:2)

  • 不要在函数调用(CONCAT),
  • 中隐藏索引列
  • OR对于优化是致命的,
  • 主要通配符(%)使索引在LIKE中无法使用,
  • 由于您要获取所有列,因此使用“覆盖”索引是不切实际的。
  • 在某些情况下,ORDER BY的索引可以用于,而不是WHERE。但是你有ASC和DESC的混合,所以这是不可能的(直到8.0版)。

计划A:在字段上使用FULLTEXT和MATCH。 (FULLTEXT存在一些限制,可能导致无法使用。)

计划B:有一个额外的列,其中包含列的串联,并对其执行单个LIKE。 (这并不能解决所有问题。)

底线:如果你生活在他们的约束范围内,那么索引非常有效。您的查询违反了许多限制,我认为查询没有任何希望;它必须执行表扫描。

警告:可能会有更多问题。