2011-08-27 71 views
4

可能重複:
Which is faster/best? SELECT * or SELECT column1, colum2, column3, etcMySQL的選擇性能

我有一個關於MySQL的性能問題。在開始之前,我爲我的壞英語感到抱歉。

這是一個問題:星號和字段名之間用逗號分隔的性能差異是什麼。

例如:a在名爲「example_table」的表中有一個表和名爲「f1,f2,f3,f4,f5」的5個字段。

select * from `example_table`; 

select f1, f2, f3, f4, f5 from `example_table`; 

感謝的答覆。

+1

我知道這是一個騙局,但似乎SO不允許你搜索'*' –

+0

我的同事在數據庫管理方面比我好得多,總是告訴我不要使用'SELECT *',因爲它需要比表示需要的時間多得多的時間...... – Marco

回答

4

如果您選擇所有字段,則不會有可測量的性能差異。

這提高了代碼的可讀性,因爲您確切知道查詢將返回哪些字段。

如果你沒有選擇所有的字段,第二種形式的性能會略好,因爲MySQL將在網絡上發送更少的數據。

如果表中包含TEXT或BLOB列,並且您不要求這些列,則這可能會導致磁盤讀取次數減少。這些類型不是直接存儲在行中,所以這會避免一些額外的磁盤讀取。

但是,如果您選擇所有字段,則不會有可測量的性能差異。

+0

OP討論的是在SELECT *和顯式選擇所有列之間進行選擇的情況。 –

3

執行此查詢時不會有性能差異;這兩個查詢是等價的。都選擇表中的所有列。

它可能會採取一些額外的納秒解析只是因爲有更多的字符來解析第二個查詢,但不會造成任何顯著(甚至衡量)的區別。

但是,考慮如果稍後將額外的列添加到表中,會發生什麼情況。如果原始查詢中不需要此列,則它仍將投影到查詢中並傳輸到調用應用程序。這可能確實會在應用程序中造成可觀的放緩。因此,仍建議僅選擇所需的列。 (如果你正在編寫代碼來顯示整個數據庫表,那麼*當然是合適的,因爲的任務是「獲取表中的所有列」。)

+0

我認爲@ arnaud576875是正確的,如果一個表包含很多字段並且用戶只需要一些... – Marco

+1

他在這種情況下是正確的,但這不是OP詢問的場景。 – cdhowie

+0

哦,你是對的,我沒有注意到example_table只有五個字段。好的,你說得對! :) – Marco