2014-11-13 30 views
0

索引能否傷害?這是我的整個問題。我很好奇。在SQL中,索引是否有害?

+0

你會考慮次優的有害嗎? –

+0

是的。任何不利的東西。 – japem

+0

應該在數據庫中仔細考慮索引的類型和數量。索引可能非常大,因此空間成爲考慮因素。 – paqogomez

回答

3

查詢優化器將簡單地忽略與查詢無關的索引。但是在查詢優化期間,他們仍然需要花費幾微秒,考慮是否應該使用每個索引。

你在一個表上的索引越多,越複雜,優化的工作分析是用最好的一個。在極少數情況下,優化階段實際上可能比查詢執行成本更高。

我曾在最近幫助使用MySQL 5.6客戶端,其中一些新的複雜的查詢優化功能,導致查詢優化過程中使用100%CPU的情況。基本上,它使優化器估計了成千上萬的指數選擇排列的好處,就像一個展望未來幾步棋的象棋遊戲程序。

爲了解決這個問題,我們有效地改變了一些配置變量來使MySQL 5.6的優化器跳過了新的功能,並阿瓜約最優的索引選擇,就像是在MySQL 5.5。這解決了這種情況下的CPU高峯問題。

這種情況是例外,因爲查詢非常複雜,並且他們有很多索引。

這種情況也是非常具體的一個品牌RDBMS中的一個版本。但其他品牌的數據庫可能有類似的邊緣情況。

+0

這很有道理。謝謝。 – japem

1

是的,索引可能會受到傷害。首先,在插入,更新和刪除操作期間維護索引時會有開銷。這種開銷可能是有害的,特別是在高容量交易環境中。

索引也可能被錯誤地使用。例如,下面的查詢可以是相當難優化:

select t.* 
from table t 
where col1 > 'x' 
order by col2 

的時候有兩個指標,一個是關於col1,另一個在col2

一種方法是使用col1索引取所有適當的行。然後使用order by進行排序。另一種方法是使用col2索引進行排序,然後一次過濾一行。

哪種方法更好取決於數據,優化程序可能很難做出正確的決定。這是第二個索引可能意味着錯誤索引用於優化的情況。

一般情況下,指數確實與查詢優化和許多系統幫助,維護他們的額外開銷可以忽略不計。但是,這並不意味着他們總是有幫助的。

相關問題