我有一個消息表。 所以我有,列id
,from
,to
等 如果我想顯示收件箱中爲特定用戶我會寫一個SELECT語句基於where子句使用的索引正確的列
where to = 'username' order by id desc limit 0,20;
這將顯示該用戶第一次20個消息。所以很明顯,我應該把索引放在to
列,並且已經有一個id列的索引,因爲它是主鍵,但將索引設置在一起(to
,id
)會更好嗎?
我有一個消息表。 所以我有,列id
,from
,to
等 如果我想顯示收件箱中爲特定用戶我會寫一個SELECT語句基於where子句使用的索引正確的列
where to = 'username' order by id desc limit 0,20;
這將顯示該用戶第一次20個消息。所以很明顯,我應該把索引放在to
列,並且已經有一個id列的索引,因爲它是主鍵,但將索引設置在一起(to
,id
)會更好嗎?
不幸的是,答案比適合SO的要大。人們已經寫了這方面的書。
簡而言之,在(to, id DESC)
上使用索引將是解決該查詢的最佳選擇。索引中的第一個字段確保數據易於搜索,並且所有感興趣的記錄位於一個連續的塊中。索引中的第二個字段確保該連續塊被預先排序,這使查找前20條記錄變得很簡單。
但維護該索引也是一個問題。這樣的指數可能非常容易發生分裂。是否有能力在夜間維護工作中重建索引?而且磁盤空間開銷越大,索引越多。您是否有磁盤空間爲每個可能需要它的查詢創建一個新的索引?並且額外的索引會增加寫入開銷。表寫入的頻率如何以及延遲時間有多關鍵?除了要篩選/搜索/連接的字段外,添加要查詢的字段也意味着您只需讀取索引,而不是「連接」到基表。這種益處是否值得擁有更多和更廣泛索引的開銷進一步增加?
這是一個很好的問題,用一個非常廣泛的答案,其中我只是在這裏發癢的表面。