mysql中,select a,b 与 select *效率到底差多少?

比如table t1 有1000w条数据,t1有a,b,c,d,,,z 等二十多个字段,

select a1 一个字段 和 select a,a1,a2,,,,a30 三十个字段 条件都一样。 能差多少? 自己测试一下好像差别很大, 具体的原因?

评论 (1)链接2012-10-31 
  • 0 支持
    你这个条件描述不清楚。1.如果返回的结果是1000w条,那只返回a1当然快,因为数据大小太悬殊。2.如果a1列有索引,也会快很多。3.排除上面两个条件,应该悬殊不大。 – athlon 2012-10-31

这个效率是多个方面的,其实你要完整的来看:

  
select * from table where 1;
select a1 from table where 1;

这两个表面上来看是得到相同的结果,但是效率可能就会差非常之多。
1、select * 的确需要查询数据字典DD,返回所有的字段名,然后检索所有的字段,其中包含了你所不需要的字段,数据检索量可能是原来的几十倍,而且如果包含了大量的未索引字段的话,更会浪费。
2、select * 不只是数据库本身的问题了,你可以想像一下,如果查出的数据是所需要的几十倍,那么多余的数据怎么办? 对,那就是采用第三方程序进行过滤,比如我们常用的PHP来处理,于是又多了两个子问题。
2-1、数据库如果和前端程序不在一台服务器上,而是采用的中间件架构,于是大量的网络开销不可避免。
2-2、PHP等服务端程序,不得不从大量的数据中进行过滤处理后才能返回给查询,那么多余的内存,CPU等开销也是不值得的。

因此,如果应用很大,建议不要检索多余的字段,否则性能可能会有巨大的差异。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2012-10-31
  • 0 支持
    +1
    几点意见:
    1. a1上有索引的话,第二个sql走覆盖索引,还会快很多;
    2. "select * 的确需要查询数据字典DD,返回所有的字段名...": 数据字典这个,在楼主的1kw条记录面前直接可以忽略不计了。
    主要还是数据量的问题
    – brayden 2013-06-05
  • 社区维基

    0 票

  • Tony
    1

第一种要快一些,第二种要慢一些,因为是全表扫描。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (2)链接 • 2012-10-31
  • 0 支持
    30个字段的话相差多少, 但以前看过一篇文章说,相差很小,忘记原理是什么了? – 狂想者2012 2012-10-31
  • 0 支持
    关键是where后面的条件语句,还有就是数据表有没有设置索引,通过索引会更快。当在,I0方面也是一个因素 – Tony 2012-10-31

查询速度的快慢更多的是取决于你的where条件和命中索引的情况,德问上有很多关于sql优化方面的问题,可以看一下。
你说的这两种方式主要区别在于select * 需要查询数据字典,确定这个表有哪些字段,并返回全部的列值,select 部分字段不用查询数据字典并返回的数据值少,理论上select 部分字段性能能好,实际上已经差别不大了。一是数据库的优化,而是硬件的提高。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (2)链接 • 2012-10-31
  • 0 支持
    这么说吧 , select a 一个字段 和 select a,a1,a2,,,,a100 条件都一样。 能差多少? 自己测试一下好像差别很大, 具体的原因? – 狂想者2012 2012-10-31
  • 0 支持
    @狂想者2012 这里差别更多的在于磁盘IO和网络传输,毕竟返回2列值和100列的值的数据量是差着50倍 – 庞彤彤 2012-10-31

楼主可以这么理解:
select * 会多一个类似于SHOW COLUMNS FROM table的操作获取所有字段,然后再把字段用,分割拼接 替换掉*
select a,b,c 省去了获取字段的这个过程。
效率差别 直接想吧~

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-10-31

返回越多越慢 当数量级达到一定量的时候会建立临时表慢的速度就翻倍了 结果集的大小是占用一定系统内存的 内存满了以后就会简历临时表

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-10-31
德问是一个专业的编程问答社区,请 登录注册 后再提交答案