2011-02-16 131 views
4

可能重複:
Why is SELECT * considered harmful?SELECT * SQL查詢VS選擇特定的列SQL查詢

可能是一個數據庫noob問題。

我們的應用程序有一個表像下面的

表WF

Field    | Type  | Null | Key | Default | Extra   | 
+--------------------+-------------+------+-----+---------+----------------+ 
| id     | int(11)  | NO | PRI | NULL | auto_increment | 
| children   | text  | YES |  | NULL |    | 
| w_id    | int(11)  | YES |  | NULL |    | 
| f_id    | int(11)  | YES |  | NULL |    | 
| filterable   | tinyint(1) | YES |  | 1  |    | 
| created_at   | datetime | YES |  | NULL |    | 
| updated_at   | datetime | YES |  | NULL |    | 
| status    | smallint(6) | YES |  | 1  |    | 
| visible   | tinyint(1) | YES |  | 1  |    | 
| weight    | int(11)  | YES |  | NULL |    | 
| root    | tinyint(1) | YES |  | 0  |    | 
| mfr    | tinyint(1) | YES |  | 0  |    | 
+--------------------+-------------+------+-----+---------+----------------+ 

此表有望成爲向上千萬的記錄。該架構預計不會有太大變化。我需要檢索列f_id,兒童,狀態,可見,重量,根,製造商。

哪種方法對數據檢索更快?

1)Select * from WF where w_id = 1 AND status = 1;

我將剝離在應用層的不必要的列。在查詢

2)Select children,f_id,status,visible,weight,root,mfr from WF where w_id = 1 AND status = 1;

沒有必要剝去不必要的列作爲其預先選定的。

有沒有人有一個真實的生活基準,哪個更快。我知道有些人說Select *是邪惡的,但是當試圖獲得整個塊時MySQL會反應更快,而不是檢索選擇性列?

我使用MySQL版本:5.1.37-1ubuntu5(Ubuntu),應用程序是Rails3應用程序。

+7

你是擁有1000萬記錄表的人;你能獲得比你的基準更多的現實生活嗎? – JeffO 2011-02-16 18:31:26

+0

我正在向Rails進行遷移。我沒有獲得目前的生產。從技術上講,我現在沒有數據。 – papdel 2011-02-16 18:32:50

回答

0

如果返回的列較少,那麼通過網絡的數據就會減少,而數據庫處理的數據也會減少,並且它幾乎總是會返回得更快。使用select *時,數據庫也往往會變慢,因爲數據庫必須弄清楚列的內容,從而比指定更多的工作。如果結構發生顯着變化,進一步選擇*通常會返回不好的結果。它最終可能會顯示你不想看到的用戶字段;不希望他們看到,或者如果有人足夠愚蠢地重新排列列,那麼應用程序實際上可能顯示錯誤順序或者如果從數據中插入數據,他們在錯誤的列。在生產代碼中使用selct *幾乎是一種不好的做法。

5

作爲包含列子集的select語句可以顯着加快的示例,它可以在僅包含這些列的表上使用覆蓋索引,這可能會導致更好的查詢性能。