2011-09-13 24 views
5

這個問題剛剛出現在我的腦海中,我無法回答它。從SQL語句中選擇特定值是否與「SELECT *」相比提高了效率

假設您正在爲網站開發新聞頁面。在你的表,你將有以下字段:

ID,標題,主題,內容,時間,作者,關鍵詞

在實際的頁面,用戶會看到,你可能只希望顯示如下:

標題,內容,關鍵詞

現在,當你去寫SQL語句,它會更好把它寫,因爲這:

SELECT Title, Content, Keywords FROM newstable; 

或者像這樣:

SELECT * FROM newstable; 

我始終認爲,使用前者的例子是更爲有效,更快地使用。但是,我現在認爲使用select all語句可能會更快更簡單。

無論是對的方式,還是它們如何寫它們真的很重要?

回答

13

是的,它關係到性能和其他原因。

  • 當您僅選擇所需的列時,必須返回更少的數據。這意味着更少的時間將其從硬盤驅動器中取出並通過電線發送。
  • 使用covering index可以完全滿足您選擇的列,這可以使查詢快很多倍
  • 通過指定列名稱,可以記錄您在代碼中使用的數據。當你回來做維護時這非常有用。
  • 通過不使用*,您不會在重命名,添加或刪除列時運行代碼中斷的機會。如果你明確地使用了列名,你會得到一個查詢執行時錯誤,而不是盲目傳遞給你的代碼的新結果,在這裏誰會知道會發生什麼。
+0

你能解釋一下多一點? –

+1

@remi哪部分? – RedFilter

+0

我想有:用SELECT *,服務器必須進入它的內部數據庫中查找表結構 –

1

是的,它對性能有影響。另外,可讀性更好,那麼你確切地知道你正在請求什麼數據。

如果你不需要它們,那麼你應該具體說明你需要的數據列,然後爲什麼要把它們拉出來。你會只是返回不必要的數據

4

我建議最好的做法是明確寫出列。

首先,這將最大限度地減少返回的數據量,只有你所要求的。

接下來,它會刪除可能的迴歸錯誤,如果有人向數據庫添加列。

另外,它不需要太多時間。

最後,你幾乎肯定會by子句有一個訂單,這可以通過僅索引數據來滿足。

3

除了性能方面的原因(較小的結果集返回,並且僅索引檢索的可能性),在指定的順序應用程序代碼返回已知數量的命名列,使代碼更健壯 - 有沒有機會,你會意外地編寫對錶格當前定義的任何依賴。