2010-09-21 71 views
1

我是一名自學成才的開發人員,並且一直被告知不要使用SELECT *,但我的大多數查詢都需要知道某一行的所有值...MySql查詢:真的從不使用SELECT *?

我應該怎麼使用?我應該每次列出所有屬性嗎?像Select elem1,elem2,elem3,...,elem15 FROM ...?

感謝

+0

可能的重複[什麼原因不使用select *?](http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select) – NotMe 2010-09-21 19:34:43

+0

另外: http://stackoverflow.com/questions/128412/sql-query-question-select-from-view-or-select-col1col2from-view – NotMe 2010-09-21 19:35:12

回答

3

SELECT * FROM ...並不總是最好的方法,除非你需要所有的列。這是因爲,如果一個表有10列,而你只需要2-3列,並且這些列是索引的,那麼如果你使用SELECT *,查詢將會運行得更慢,因爲服務器必須從數據文件中獲取所有行。如果您只使用實際需要的2-3列,那麼如果從覆蓋索引中獲取行,則服務器可以更快地運行查詢。覆蓋索引是用於在不讀取數據文件的情況下返回結果的索引。

因此,只有在實際需要所有列時才使用SELECT *。

1

只列出你所需要的,最好是使用表的別名列:

SELECT t.elem1, 
     t.elem2 
    FROM YOUR_TABLE t 

表別名的存在有助於演示什麼是列(並從那裏的)與一派生列。

4

如果你真的需要所有的列,並按名稱獲取結果,我會繼續使用SELECT *。如果您通過索引獲取行結果,那麼指定列名是有意義的,否則它們可能不會按您期望的順序(尤其是在表模式更改的情況下)。

+0

我從來沒有需要通過索引而不是名稱來獲取列。我甚至無法提出一個有效的場景。 – CaffGeek 2010-09-21 19:24:44

+0

乍得,我很高興。我當然不會選擇通過名稱訪問進行索引訪問;我只知道存在通過索引選擇結果的API,而OP沒有指定他用來與MySQL交談的語言或平臺。 – Nick 2010-09-21 19:25:45

+1

我不知道爲什麼你會這樣做,但PHP的['mysql_fetch_row'](http://ca.php.net/manual/en/function.mysql-fetch-row.php)將返回一個數字索引的數組,這是一個在野外發生的例子。 – 2010-09-21 19:28:14

0

使用select *所帶來的唯一真實性能是在結果集中發送額外列所需的帶寬(如果不是必需的話)。除此之外,關於使用select *沒有任何固有的「壞」。

+1

不正確。 http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select – NotMe 2010-09-21 19:34:15

+0

我被p了。 – Matt 2010-09-21 20:17:54

2

如果您絕對必須使用*,請嘗試將其限制到特定表格;例如:

SELECT t.* 
    FROM mytable t 
+0

好點,連接表時我不會自己使用'*'。 – Nick 2010-09-21 19:30:29

1

如果你肯定你會總是需要所有列然後select *應該沒問題。但我的理由是避免它:說另一個開發人員有另一列添加到表中,這是不需要你的查詢..然後有開銷。隨着更多列的添加,這可能會變得更糟。

0

您可能會從子查詢中獲得SELECT *

0

是的,選擇*是不好的。您不會說明您將使用哪種語言處理返回的數據。假設您將這些記錄作爲數組(而不是哈希映射)接收回來。在這種情況下,行[12]中的內容是什麼?當你編寫應用程序時,也許它是ZipCode,但是猜猜當有人在ZipCode之前插入字段SuiteNumber時會發生什麼。

或者假設下一個編碼器將巨大的blob字段附加到每個記錄。哎喲!

或者更微妙一點:假設您正在進行連接或子選擇,並且沒有文本或Blob類型字段。 MySQL將在內存中創建它需要的任何臨時文件。但是,只要包含一個文本字段(即使是TinyText),MySQL也需要在磁盤上創建臨時文件,然後調用排序合併。這不會破壞程序,但它可能會導致性能下降。

選擇*是犧牲可維護性,以節省一些打字。