我正在玩弄(感興趣),用簡單鄰接列表中的節點樹檢索使用局部變量的遞歸查詢。使用不使用INDEX的查詢變量進行SELECT選擇
我迄今爲止的解決方案很有趣,但我想知道爲什麼MySQL拒絕使用任何INDEX
來優化此查詢。 MySQL不能通過使用INDEX
來查找最近的孩子嗎?
我很好奇MySQL爲什麼沒有。即使當我使用FORCE INDEX
執行計劃不會改變。
這是查詢至今,憑藉5
是父節點的ID:
SELECT
@last_id := id AS id,
parent_id,
name,
@depth := IF(parent_id = 5, 1, @depth + 1) AS depth
FROM
tree FORCE INDEX (index_parent_id, PRIMARY, index_both),
(SELECT @last_id := 5, @depth := -1) vars
WHERE id = 5 OR parent_id = @last_id OR parent_id = 5
注意,之所以不能是小數據集,因爲當我指定FORCE INDEX (id)
或FORCE INDEX (parent_id)
或FORCE INDEX (id, parent_id)
時,行爲不會改變...
該文檔說:
您也可以使用FORCE INDEX,其行爲像USE INDEX(index_list),但除了假定表掃描非常昂貴。換句話說,只有在無法使用某個給定索引來查找表中的行時才使用表掃描。
必須有一些呈現查詢無法使用INDEX,但我不明白它是什麼。
免責聲明:我知道有不同的方式來存儲和檢索SQL分層數據。我知道嵌套集模型。我沒有尋找替代實施。我不是在尋找嵌套集合。
我也知道查詢本身是堅果,併產生錯誤的結果。
我只是想,爲什麼MySQL是不是在這種情況下使用INDEX
理解(詳細)。
有時一個表有這麼幾條記錄,使用索引的開銷比讀取整個表的時間要多。 – Randy 2012-07-09 21:56:21
@randy現在有一個似是而非的論點... – xandercoded 2012-07-09 21:57:04
@Randy看到更新的問題 – Kaii 2012-07-09 22:03:14