2011-07-06 24 views
58

可以說在員工表中,我已經在表格的emp_name列上創建了一個索引(idx_name)。如何在select語句中使用索引?

我是否需要在select子句中顯式指定索引名稱,否則它將自動用於加快查詢速度。

如果需要在select子句中指定,那麼在select查詢中使用索引的語法是什麼?

回答

55

如果你要測試的指標,看它是否有效,這裏是語法:

SELECT * 
FROM Table WITH(INDEX(Index_Name)) 

with語句將迫使指數使用。

+40

此帖未回答此問題。簡而言之,答案是:您不必在查詢中指定索引。它被自動使用(或不)。但是,你可以強制它。更多細節(何時以及爲什麼會這樣)在下面的其他帖子中。 – Rast

2

通過使用索引應用於您的條件的列,它將自動包含在內。您不必使用它,但它會在使用時加快查詢速度。

SELECT * FROM TABLE WHERE attribute = 'value' 

將使用適當的索引。

26

問得好,

通常數據庫引擎會自動選擇要使用的索引基於查詢執行計劃它建立。但是,當您想強制數據庫使用特定索引時,有一些非常罕見的情況。

爲了能夠回答您的具體問題,您必須指定您正在使用的數據庫。

對於MySQL,你想讀如何做到這一點

8

優化器將判斷是否使用索引會使你的查詢運行得更快的Index Hint Syntax文檔,如果是,它會使用索引。

根據您的RDBMS,您可以強制使用索引,但除非您知道自己在做什麼,否則不建議使用索引。

一般來說,你應該,你在表中使用索引列加入的何陳述

12

一般,該指數將被使用,如果使用索引,然後可能不必執行進一步的書籤的假定成本查找低於僅掃描整個表的成本。

如果您的查詢的形式是:

SELECT Name from Table where Name = 'Boris' 

和1個排出來的有1000名鮑里斯,它幾乎肯定會被使用。如果每個人的名字都是Boris,那麼它可能會採用表掃描,因爲索引不太可能成爲訪問數據的更有效的策略。

如果它是一個寬表(列很多的),你這樣做:

SELECT * from Table where Name = 'Boris' 

然後,它仍然可以選擇執行表掃描,如果它是一個合理的假設,這將需要更多的時間檢索表中的其他列比查找名稱還要多,如果它可能會檢索很多行,

4

通常,當您在表上創建索引時,數據庫將在搜索該表中的數據時自動使用該索引。你不需要做任何事情。

但是,在MSSQL中,您可以指定一個index hint,它可以指定應使用特定索引來執行此查詢。有關這方面的更多信息可以在here找到。

Index hint也似乎可用於MySQL。感謝都鐸君士坦丁。

18

如何在select語句中使用索引?
這樣:

SELECT * FROM table1 USE INDEX (col1_index,col2_index) 
    WHERE col1=1 AND col2=2 AND col3=3; 


SELECT * FROM table1 IGNORE INDEX (col3_index) 
WHERE col1=1 AND col2=2 AND col3=3; 


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2); 

還有更多的方式檢查this

我是否需要明確指定?

  • 不,不需要明確指定。
  • 數據庫引擎應根據自@Tudor Constantin答案構建的查詢執行計劃自動選擇要使用的索引。
  • 優化器將判斷您的索引的使用是否會使您的查詢運行得更快,如果是,它將使用索引。 from @niktrl回答