2013-07-14 51 views
5

我總是從SQL專家那裏聽到,在SELECT語句中使用'*'符號效率不高,而且最好列出所有字段名稱。SELECT * - 利弊

但是對於我個人而言,當向表中添加新字段並相應地更新所有存儲過程時,我並不覺得它有效。

那麼使用'*'有什麼優點和缺點?
謝謝。

+1

可能重複[可以選擇\ *使用永遠是有道理的嗎?](多表時http://stackoverflow.com/questions/3635781/can-select-usage-ever-be-justified) –

回答

13

一般來說,使用SELECT *不是一個好主意。

優點:

缺點:

  • 您正在返回的數據超出您的需求。假設您添加一個包含每行200k的VARBINARY列。你只需要在一個地方這個數據的單個記錄 - 使用SELECT *你可以最終返回每10行2MB,你不需要
  • 明確哪些數據被用來
  • 指定列意味着你得到當一列被刪除錯誤
  • 查詢處理器必須做更多的工作 - 找出上表中存在哪些列(感謝@vinodadhikary
  • 你可以找到其中一列使用更加方便
  • 你如果y,則獲取連接中的所有列OU使用SELECT *
  • 不能使用序號引用(雖然使用列序號引用本身不好的做法)
  • 也看到了答案:What is the reason not to use select *?
+3

要添加到缺點,查詢處理器必須首先找出特定表中存在哪些列。 – vee

+1

@vinodadhikary - 爲什麼比驗證包含所有列名的明確列列表更有效?我想這實際上可能會稍微少一些工作,因爲它只需要檢索所有列元數據而不是單獨驗證每個元數據。 –

+0

@MartinSmith,野生字符'*'必須在所有字段驗證之前展開。所以如果'select'包含一個被添加到field_list的'*'。就性能而言,優化是最小的,但保存了額外的函數調用。我無法真正找到甲骨文的MySQL源代碼版本(我並沒有真正費心去挖掘它),但在github中發現了'twitter'版本。在498行和554行之間查看'https:// github.com/twitter/mysql/blob/master /','sql/sql_select.cc'' JOIN :: prepare',並在7846行查看'setup_wild', SQL/sql_base.cc'。 – vee

5

優點:

  • 當你真的需要所有列時,它的寫入時間更短select *

缺點:

  • 大多數時候,你不需要所有的列,但只需要其中的一部分。僅檢索想要的內容效率更高
  • 您不能保證檢索到的列的順序(或者至少,查詢中的順序不明顯),它禁止按索引(僅按名稱)訪問列。但是,名稱也遠遠沒有明顯
  • 連接部分具有潛在的具有相同名稱的列,您可以定義別名爲這些列