这是我的问题:
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
请参阅?它不使用任何索引。为什么?以及如何使查询最佳?
答案 0 :(得分:2)
CONCAT
),%
)使索引在LIKE
中无法使用,ORDER BY
的索引可以用于,而不是WHERE
的。但是你有ASC和DESC的混合,所以这是不可能的(直到8.0版)。计划A:在字段上使用FULLTEXT和MATCH。 (FULLTEXT存在一些限制,可能导致无法使用。)
计划B:有一个额外的列,其中包含列的串联,并对其执行单个LIKE。 (这并不能解决所有问题。)
底线:如果你生活在他们的约束范围内,那么索引非常有效。您的查询违反了许多限制,我认为查询没有任何希望;它必须执行表扫描。
警告:可能会有更多问题。