簡體   English   中英

為什么我的查詢不使用任何索引?

[英]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 )中隱藏索引列,
  • OR對於優化來說是致命的,
  • 前導通配符( % )使該索引在LIKE不可用,
  • 由於要獲取所有列,因此具有“覆蓋”索引是不切實際的。
  • 在某些情況下,可以使用ORDER BY的索引代替 WHERE的索引。 但是您混合使用了ASC和DESC,因此這是不可能的(直到8.0版)。

計划A:在字段上使用FULLTEXT和MATCH。 (FULLTEXT的局限性可能使其無法使用。)

計划B:在列之間串聯一個額外的列,並對它執行一個LIKE。 (這不能解決所有問題。)

底線: 如果您在索引的約束范圍內, 那么索引將非常有效。 您的查詢違反了許多限制,因此我認為查詢沒有任何希望。 它必須執行表掃描。

警告:可能還有更多問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM