簡體   English   中英

MySQL查詢需要更長的索引時間?

[英]MySQL query takes longer with indices?

我有一個MySQL InnoDB表,帶有3行的events

event_id  ---> int
start     ---> long
end       ---> long

我編寫了一個簡單的查詢,以獲取與某個其他事件沖突的某個范圍內的所有事件:

select a.* from events a, events b 
where a.event_id != b.event_id and 
      a.start < b.end and 
      b.start < a.end

該表有約1萬行,耗時約2秒。 在嘗試調整表以提高性能時,我在startend列上添加了索引。 由於某種原因,這會極大地降低性能 5倍 有誰知道或有任何想法,為什么添加這些索引會損害如此糟糕的性能?

MySQL查看所涉及的列,並誤認為索引將有助於改善查詢。 但是問題是索引解決了開始部分,但是需要解析回記錄ID才能解決a.event_id!= b.event_id,這本身就是一個昂貴的操作。

沒有索引會強制執行交叉連接和過濾器,盡管交叉連接和過濾器可能使大量臨時記錄膨脹,但它是一個更簡單明了的實現。

如果您的查詢受到a或b上某個范圍的限制,並且/或者該表大於10k,則它可能會變得非常不同。

如果需要保留索引,則可以強制特定查詢(如果您知道這會有所幫助)忽略索引:

select a.*
from events a ignore index (index1)
cross join events b ignore index (index1)
where a.event_id != b.event_id and 
      a.start < b.end and 
      b.start < a.end

假設索引名為index1。 在任何情況下,通過在查詢前添加“ EXPLAIN”以顯示MySQL如何收集結果(不帶索引,帶索引,帶索引但被忽略),始終可以查看MySQL在每種情況下的工作情況,這總是有幫助的

暫無
暫無

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

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