阅读本文大概须要 1 分钟。mysql
以前发过的文章中,关于 select * 和 select 全部字段的知识,有描述不恰当,此次从新纠正下,加深下理解。程序员
MySQL 5.1.37sql
表记录数 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 条件避免缓存),时间变化不大。app
结论:二者差异几乎可忽略。因此查询全部字段(或者大多数字段)的时候,大可 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·
程序员的成长之路
路虽远,行则必至
本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。
往期精彩回顾