【今日一题】谈一谈select * 的相关问题

2021/01/19

今天是第一次写关于数据库的文章,先从基础开始,循序渐进,并通过【今日一题】系列的模式对数据库的零散知识点进行碎片化整理和记录,不断学习才能不断去发现问题,才能不断的成长和进步,加油加油。

晚上在Boss上看到有个热议的数据库基础问题,说的是select * 与 select 全部字段的区别,当时脑海里答案就是select * 查询效率会慢于select 全部字段,且在开发和生产环境中都强烈禁止使用select * ,问题简单,但值得去细品。举一反三,今天重点分析分析下面的两个问题:

  • 1、select * 与 select 全部字段的区别?
  • 2、select  count(*) 与 select  count(1) 、select  count(列名)的区别?

select * 与 select 全部字段的区别

阿里巴巴Java开发手册中在“MySQL数据库”章节明确了这个问题,并给出了合理的解释,值得参考,如图所示。* 作为一种通配符,也表示所有的字段,本质上讲二者是没啥区别的。但是,从执行效率的角度分析,在解析时前者会多出从系统表获取具体字段的一步,这样查询分析器的解析成本会增加,效率则会稍慢于后者;从查询结果的角度分析,在不改变表结构的情况下二者结果相同,但后者字段顺序是可以调整的,一旦改变表结构(如增减字段),前者是不会有什么影响的,后者会因不存在某些字段而报错;从使用场景角度分析,前者效率稍低,但相对于SQL执行阶段而言,SQL解析阶段的这点延迟时间基本可以忽略不计的,特别地,对于“select 明确字段” 有时候可以避免无用字段带来的网络消耗,因此开发和生产环境一律不要使用前者,要用明确的字段来表示

select  count(*) 与 select  count(1) 、select  count(列名)的区别

阿里巴巴Java开发手册中在“MySQL数据库”章节也明确了这个问题,并给出了合理的解释,值得参考,如图所示。实际中,值为null的行可能会普遍存在,count()作为一种聚合函数用于统计行记录数,这里的区别在于null记录行是否被统计到,像select  count(列名)不会统计到含null的记录行,而count(*) 与count(1) 会统计到含null的记录行,count(*) 与count(1) 通常没什么区别。

参考:

  • 《阿里巴巴Java开发手册-2020最新嵩山版》

猜你喜欢

转载自blog.csdn.net/qq_29119581/article/details/112852255