我是一名自學成才的開發人員,並且一直被告知不要使用SELECT *,但我的大多數查詢都需要知道某一行的所有值...MySql查詢:真的從不使用SELECT *?
我應該怎麼使用?我應該每次列出所有屬性嗎?像Select elem1,elem2,elem3,...,elem15 FROM ...?
感謝
我是一名自學成才的開發人員,並且一直被告知不要使用SELECT *,但我的大多數查詢都需要知道某一行的所有值...MySql查詢:真的從不使用SELECT *?
我應該怎麼使用?我應該每次列出所有屬性嗎?像Select elem1,elem2,elem3,...,elem15 FROM ...?
感謝
SELECT * FROM ...並不總是最好的方法,除非你需要所有的列。這是因爲,如果一個表有10列,而你只需要2-3列,並且這些列是索引的,那麼如果你使用SELECT *,查詢將會運行得更慢,因爲服務器必須從數據文件中獲取所有行。如果您只使用實際需要的2-3列,那麼如果從覆蓋索引中獲取行,則服務器可以更快地運行查詢。覆蓋索引是用於在不讀取數據文件的情況下返回結果的索引。
因此,只有在實際需要所有列時才使用SELECT *。
只列出你所需要的,最好是使用表的別名列:
SELECT t.elem1,
t.elem2
FROM YOUR_TABLE t
表別名的存在有助於演示什麼是列(並從那裏的)與一派生列。
如果你真的需要所有的列,並按名稱獲取結果,我會繼續使用SELECT *
。如果您通過索引獲取行結果,那麼指定列名是有意義的,否則它們可能不會按您期望的順序(尤其是在表模式更改的情況下)。
我從來沒有需要通過索引而不是名稱來獲取列。我甚至無法提出一個有效的場景。 – CaffGeek 2010-09-21 19:24:44
乍得,我很高興。我當然不會選擇通過名稱訪問進行索引訪問;我只知道存在通過索引選擇結果的API,而OP沒有指定他用來與MySQL交談的語言或平臺。 – Nick 2010-09-21 19:25:45
我不知道爲什麼你會這樣做,但PHP的['mysql_fetch_row'](http://ca.php.net/manual/en/function.mysql-fetch-row.php)將返回一個數字索引的數組,這是一個在野外發生的例子。 – 2010-09-21 19:28:14
如果您絕對必須使用*
,請嘗試將其限制到特定表格;例如:
SELECT t.*
FROM mytable t
好點,連接表時我不會自己使用'*'。 – Nick 2010-09-21 19:30:29
如果你肯定你會總是需要所有列然後select *
應該沒問題。但我的理由是避免它:說另一個開發人員有另一列添加到表中,這是不需要你的查詢..然後有開銷。隨着更多列的添加,這可能會變得更糟。
您可能會從子查詢中獲得SELECT *
。
是的,選擇*是不好的。您不會說明您將使用哪種語言處理返回的數據。假設您將這些記錄作爲數組(而不是哈希映射)接收回來。在這種情況下,行[12]中的內容是什麼?當你編寫應用程序時,也許它是ZipCode,但是猜猜當有人在ZipCode之前插入字段SuiteNumber時會發生什麼。
或者假設下一個編碼器將巨大的blob字段附加到每個記錄。哎喲!
或者更微妙一點:假設您正在進行連接或子選擇,並且沒有文本或Blob類型字段。 MySQL將在內存中創建它需要的任何臨時文件。但是,只要包含一個文本字段(即使是TinyText),MySQL也需要在磁盤上創建臨時文件,然後調用排序合併。這不會破壞程序,但它可能會導致性能下降。
選擇*是犧牲可維護性,以節省一些打字。
可能的重複[什麼原因不使用select *?](http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select) – NotMe 2010-09-21 19:34:43
另外: http://stackoverflow.com/questions/128412/sql-query-question-select-from-view-or-select-col1col2from-view – NotMe 2010-09-21 19:35:12