2010-03-18 117 views
5

可能重複使用*:
Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc.在SELECT查詢

我目前移植寫在MySQL3應用程序和PHP4到的MySQL5和PHP5。

在分析中,我發現了幾個SQL查詢,即使在PHP中只處理一列(字段),也會使用「select * from tablename」。該表有近60列,它有一個主鍵。在大多數情況下,唯一使用的列是id這是主鍵。

如果我使用列名被明確提及而不是*的查詢,會有任何性能提升嗎? (在此應用中,只有一個是我們所需要的所有列法和所有其他方法只返回列的子集)

回答

10

通常認爲只需獲取所需內容即可。特別是如果數據庫服務器不在同一臺計算機上,則提取整行將導致查詢速度變慢,因爲有更多數據通過網絡傳輸到消費機器。因此,如果整行數據是100k數據,而您只需要更少的ID,那麼您當然會得到更快的結果。

作爲優化查詢的一般技巧,請使用EXPLAIN statement來查看查詢的成本如何。

+1

我認爲你的回答是迄今爲止最好的 – ant 2010-03-18 13:38:06

2

會有任何性能提升,如果 我使用的查詢中列 名明確提到 的*? -

1

是的。如果你獲取的數據比你需要的要多,那麼必須從磁盤讀取數據,在MySQL和PHP之間傳輸等等,這可能需要更長的時間。

+0

'SELECT *'進行了優化,但你只左右獲取你所需要的列正確。 – 2010-03-18 10:56:58

1

如果您受益多少取決於案例,但至少在您僅需要id列的情況下,您應該修復SQL。

除了減少發送無用數據的網絡通信量以外,數據庫還可以使用索引訪問少數列,而無需訪問表。這會加速很多事情。

唯一可能的缺點是服務器必須處理的不同SQL語句的數量(以及更復雜的代碼)。

1

否 - 這會影響性能,但只要架構中沒有BLOB/CLOB,它就可以忽略不計(除非您通過300波特調制解調器訪問數據庫) - 大部分工作由該數據庫是在確定WHERE子句匹配的行 - 但它的(恕我直言)不好的編程習慣使用SELECT *

C.

4

「過早的優化是所有罪惡根」。唐納德克努斯。

永遠不要問這樣的問題,如Will there be any performance boost?。但只問一個問題,如「我有一定的瓶頸,我怎麼能消除它?「

在我們的應用程序的99%,這種‘改進’是irrlelvant。正如許多其他改進的基礎上,夢想,而不是在剖析和真實需求。

+1

對不起,但我不能同意。過早優化對於不指定所需字段而言是一個不好的參數。這是懶惰的藉口,就是這樣。 – 2010-04-08 19:43:12

1

是,只取你需要的列這不僅可以提高性能,但是它會阻止你的代碼不小心打破考慮這個查詢:

SELECT * FROM 塔巴上JOIN塔布... ORDER BY COLX

當只有tabA有colX時,他們查詢作品,但如果更改架構並將colX添加到tabB,則查詢將異常終止。

當然,對所有字段使用表別名也有助於防止破損。

-Krip