[英]Why doesn't my query use any index?
這是我的查詢:
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
看到? 它不使用任何索引。 為什么? 以及如何使查詢最佳化?
CONCAT
)中隱藏索引列, %
)使該索引在LIKE
不可用, ORDER BY
的索引代替 WHERE
的索引。 但是您混合使用了ASC和DESC,因此這是不可能的(直到8.0版)。 計划A:在字段上使用FULLTEXT和MATCH。 (FULLTEXT的局限性可能使其無法使用。)
計划B:在列之間串聯一個額外的列,並對它執行一個LIKE。 (這不能解決所有問題。)
底線: 如果您在索引的約束范圍內, 那么索引將非常有效。 您的查詢違反了許多限制,因此我認為查詢沒有任何希望。 它必須執行表掃描。
警告:可能還有更多問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.