一般來說,如果您要索引所有列,這與索引沒有列相同嗎?
標題可能總結了我的問題,但要明確的是,我特別考慮的是 RDB。
我無意這樣做,我只是很好奇,並且在嘗試Google搜尋時沒有找到明確的答案。
如果它是或不是真的,可以解釋原因嗎?(如果不是太大的要求)
感謝任何願意分享對此的見解的人。
索引儲存定義索引的欄位的數據副本。通常,標準索引使用 B-Tree 資料結構來組織數據的副本。聚集索引(或圍繞索引聚集表數據 - 取決於您使用的數據庫系統)是一種特殊類型的索引,它不是儲存數據的副本,實際上是將表本身組織成 B 樹資料結構。
沒有索引(更具體地說沒有聚集索引)的表儲存在堆資料結構中。堆是無序的動態分配的數據集合,極易在數據更改時產生碎片。B-Tree 是一種有序的數據樹集合,在更改時不太容易出現碎片問題。有關Heaps 與 B-Trees 的差異和優缺點的更多深入資訊,請參閱此 StackOverflow 答案。
回到我的第一段,要記住索引是數據的文字副本(聚集索引除外),這意味著當數據被寫入表以將該數據持久保存到每個索引時是有工作的。如果你的表有 100 列,ergo 有 100 個索引,那麼當向表中插入一條新記錄時,將需要進行 100 次額外的寫操作。這顯然有一些性能影響(尤其是在上下文鎖定和阻塞中)。此外,由於 B-Tree 資料結構用於儲存索引數據,因此需要一個
O(Log2(n))
插入時間來定位 B-Tree 中插入新記錄的位置。沒有索引的表只需要進行一次寫入操作,由於它是一個儲存數據的堆資料結構,插入時間將是
O(1)
一個非常快的常量插入時間,因為數據只是在最後插入堆的原因在於它是一個無序的資料結構。顯然,從寫入的角度來看,沒有索引是最佳的。但是從讀取的角度來看,堆是有
O(n)
搜尋時間的,因為它們是無序的(基本上是隨機排序的)。B-Trees 有一個O(Log2(n))
搜尋時間,因為它們是有序的,這比 Heaps (O(n)
) 快得多。因此,索引有助於提高定位特定數據記錄時的性能,尤其是對於讀取查詢。因此,在維護太多索引與沒有足夠或適當的索引來為您的查詢提供服務之間需要權衡性能損失。
正如mustaccio 的類比所指出的那樣,在度假時打包所有衣服與不打包衣服肯定是有區別的。假設您隨身攜帶了 5 個手提箱,每個手提箱都存放不同顏色的衣服,並且您按照尺寸順序包裝了隨身攜帶的每件衣服。你的手提箱是索引。服裝是數據。對每個手提箱中的整個衣櫃進行分類需要很長時間(許多寫入索引)。現在,在你完成這些之後,假設你出去買了一件 5 種不同顏色的新襯衫,因為你非常喜歡那件襯衫。現在,您必須按顏色在每個手提箱中裝 5 份該襯衫(再寫 5 次)。很多工作。
但是現在假設在度假期間,您決定第一天想要綠色襪子和藍色牛仔褲。好吧,你的衣服都已經按顏色和尺寸分類了(在這個例子中襪子是最小的,牛仔褲是最大的)。因此,您可以非常快速地找到那些特定的衣服(讀取數據)。
相反,如果你有一個手提箱,你只是把所有的衣服都扔進去,那麼你收拾衣服會很快(寫到堆裡)。但是從那個雜亂無章的手提箱中找到那些綠色襪子和藍色牛仔褲需要很長時間(從堆中讀取)。
從表中讀取特定記錄的頻率通常比寫入/更新該特定記錄的頻率更高(儘管並非總是如此,具體取決於您的案例)。所以一些索引(經過仔細考慮)通常在你的表上有意義。