天天看點

select * 和 select 所有字段的差別

閱讀本文大概需要 1 分鐘。

之前發過的文章中,關于 select * 和 select 所有字段的知識,有描述不恰當,這次重新糾正下,加深下了解。

MySQL 5.1.37

表記錄數 41,547,002,即 4000+w 行。

使用遠端用戶端取 1000 條資料,統計時間:

SELECT * FROM dmsp.dmsp_dimension_content LIMIT 0, 1000;

時間 2.218s,網絡消耗 0.547s 。

SELECT id, appid, aop, t, uid, sid, pid, pname, bid, bname, ptype, sm, sv, bt, national, area, ov FROM dmsp.dmsp_dimension_content LIMIT 0, 1000;

取出所有字段,時間 2.250s,網絡消耗 0.578s 。

多次查詢(改變 limit 條件避免緩存),時間變化不大。

結論:兩者差别幾乎可忽略。是以查詢所有字段(或者大多數字段)的時候,大可 select * 來操作。如果某些不需要的字段資料量特别大,還是寫清楚字段比較好,因為這樣可以減少網絡傳輸。

(1)減少資料的負擔。

SELECT *,需要資料庫先 Query Table Metadata For Columns,一定程度上為資料庫增加了負擔(影響網絡傳輸的性能),但是實際上,兩者效率差别不大。

(2)考慮到今後的擴充性。

因為程式裡面你需要使用到的列畢竟是确定的, SELECT * 隻是減少了一句 SQL String 的長度,并不能減少其他地方的代碼。

(3)索引問題

select abc from table; 和 select * from table;

在 abc 字段有索引的情況下,mysql 是可以不用讀 data,直接使用 index 裡面的值就傳回結果的。但是一旦用了 select *,就會有其他列需要讀取,這時在讀完 index 以後還需要去讀 data 才會傳回結果,這樣就造成了額外的性能開銷。

綜上:除平時練習使用,其他情況都不推薦使用 SELECT * FROM XXX 。

·END·

程式員的成長之路

路雖遠,行則必至