簡體   English   中英

我應該索引已經屬於復合索引一部分的單個列嗎?

[英]Should I index individual columns that are already part of a composite index?

我在表中的4列中有一個復合唯一索引,並且存在一個性能問題查詢,該查詢會分別對2列進行過濾。 也許這是一個愚蠢的問題,但是我也應該為各個列建立索引以提高性能嗎? 謝謝你的幫助!

我正在回答這個問題,因為喬的答案不正確。

Oracle 9引入了一種新型的索引掃描,稱為跳過掃描。 這允許將索引用於非前導列。 詳細信息在文檔中進行了說明

的確,在大多數情況下,在大多數數據庫中,索引是從左到右使用的。 但是,Oracle的跳過掃描機制是一個例外,它是對其他數據庫中索引算法的增強。

答案取決於哪兩列。 復合索引可用於最左邊列的子集。 如果您的索引位於(A,B,C,D)上,而您正在對A和B進行過濾,那么就很好了。 另一方面,如果您要過濾B和C,則此索引將無濟於事,您需要創建一個新索引。

您要權衡利弊。 較小的索引更快。 在示例中,我們僅嘗試兩列。 假設我有帶有字符列A和B的表X。

不用說我創建一個A + B索引,另一個創建B + A索引。

這使我可以僅對A或B使用索引。但是在讀取索引時,SQL引擎必須讀取更多的A + B或B + A總數據量。 因此,這要比僅為A或僅對B擁有一個慢。所以為什么不放入4個索引。 好的,您可以這樣做,但是現在您必須降低插入速度,因為您必須維護4個不同的索引。

沒有確切的正確答案。 其他因素也會影響差異。 您使用哪個SQL引擎,哪個版本的供應商sql引擎。 了解這些動作的優缺點的基本動態。 將其與對您的數據集和使用數據庫的數據集有更好的了解相結合。 例如,如果每個給定的A記錄很少有三個以上的B記錄。 擁有復合索引可能不會有多大幫助。 引擎使用索引查找三個記錄,然后在其中選擇要返回的記錄,會更快。

您的結果可能會有所不同。 但這在很大程度上是工程折衷的情況。

暫無
暫無

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

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