2012-08-03 29 views
0

哪些SQL查詢將用更少的時間來執行 - 無需查詢用WHERE子句,或者當:性能與條件下對比SQL查詢中沒有where子句

  1. WHERE子句交易索引場(如主鍵字段)
  2. 非索引

當我們用索引字段的工作,因此與WHERE會更快查詢我想WHERE子句交易。 我對不對?

謝謝!

+3

這些問題沒有二進制答案。 – Aushin 2012-08-03 20:37:28

回答

3

。這完全取決於特定的上下文。但只是爲了答覆。把這個簡單的查詢:

SELECT first_name FROM people WHERE last_name = 'Smith'; 

要處理該查詢沒有索引,每列,姓氏必須檢查表中的每一行(全表掃描)。

使用索引,您可以遵循B樹數據結構,直到找到「Smith」。

對於非索引,最壞的情況看起來是線性的(n),而對於B樹,它將是log n,因此在計算上更便宜。

1

不確定你的意思是'用WHERE子句查詢還是不查詢',但你說得對,大多數情況下,在索引字段上使用WHERE子句的查詢的性能優於其非WHERE子句的查詢索引字段。

其中性能將相同(即索引無關緊要)的一個實例是在where子句中運行基於範圍的查詢(即WHERE col1> x)時。這會強制對錶格進行掃描,因此速度與非索引列上的範圍查詢速度相同。

真的,這取決於如已提到的,沒有固定的答案,這一點,你在where子句中引用的列,該類型的列中的數據,該類型的運行查詢等

+0

查詢條件爲col1> 100',其中'col1'爲索引,不一定會掃描整個表格。根據選擇列表和其他子句,它可以執行索引範圍掃描。 – 2012-08-03 20:46:04

0

它可能取決於你寫的where子句的類型。在一個簡單的where子句中,通常最好在你正在使用的字段上有一個索引(而且uindexes可以並且應該建立在比PK更多的地方)。但是,您必須爲索引編寫一個可以區分的where子句,才能發揮作用。看到這個問題上sarability的一些準則:

What makes a SQL statement sargable?

0

存在如下情況:在主鍵的where子句會比較慢。

最簡單的是一行表。使用索引需要加載索引和數據頁 - 兩次讀取。沒有索引將工作削減一半。

這是一個退化情況,但它指出了問題 - 所選行的比例。或者更確切地說,解析查詢所需的頁面比例。

當所需數據位於所有頁面上時,則使用索引減慢速度。對於非主鍵,當表大於頁面緩存並且訪問是隨機的時,這可能是災難性的。

由於頁面是按主鍵排序的,最糟糕的情況是需要額外的索引掃描 - 不算太糟糕。

某些數據庫使用表中的統計信息來決定何時使用索引以及何時執行全表掃描。有些不。

總之,對於低選擇性查詢,索引將提高性能。對於高選擇性查詢,根據各種因素,使用索引可能會導致性能稍差或性能下降。