2010-09-24 32 views
1

如果我在返回所有行的查詢中使用了索引列,那麼使用where子句中的Index列是否有利?如果查詢返回所有行,數據庫索引是否有用?

例如, select * from table1 where Salary> 1;

如果所有員工的工資大於1,那麼在where子句中使用Index列是否有利?

如果數據庫最有可能像上面那樣使用,那麼在插入時索引的開銷會很大?

回答

4

當您執行沒有ORDER BY的完整掃描時,索引無用。 Oracle索引組織表,Postgresl集羣表,MySQL(InnoDB)PRIMARY KEY聚集索引:給予ORDER BY很大的性能。

http://dev.mysql.com/doc/refman/5.1/en/innodb-index-types.html

「是否同時插入如果數據庫是最有可能被上文用來索引一筆大開銷?」 如果索引適合RAM,一切都可以。

+0

+1爲您的無敵。 – 2012-07-18 01:45:41

0

如果您的查詢返回所有行,所有列並且沒有排序索引,則根本無法幫助完成此查詢。虛假謂詞總是沒有意義的,總是評價爲真。

0

問題的形式似乎有點混亂。我不認爲你真的在問使用某個WHERE子句是否有利。當然,如果你想返回Salary> 1的行,那麼指定它是有好處的 - 否則你可能無法得到你期望的結果(數據可能已經改變)!

我認爲你真正想要問的是,這個查詢是否可以比沒有它的索引更好地執行索引。我認爲我們不一定有足夠的信息來回答這個問題。我們不知道您正在使用哪個DBMS,或者如何存儲表格或可能使用哪種類型的索引。例如,如果查詢是對視圖的查詢,並且對視圖進行索引或對其進行索引,則索引可能會對性能產生很大影響。

但是,在查詢中指定SELECT *通常是不好的做法。指定SELECT *表示您將獲得所有列,即使列集已更改。最好只指定那些你需要的列,因爲這樣你就有更好的機會獲得最高效的執行計劃。

0

我想知道@ iddqd的答案是否正確。

條件,「WHERE Salary>`」將需要一個索引不是嗎?

MySQL如何知道所有工資都大於1,除非它具有索引或b。)執行全表掃描?

如果你知道一個事實,你將需要執行全表掃描,那麼你可以使用:

IGNORE INDEX ([*index_list*]) 

注意MySQL不留意上面的指令中的ORDER BY和GROUP BY之前版本5.1.17。

相關問題