当前位置: 首页 > news >正文

我出一道面试题,看看你能拿 3k 还是 30k!

大家好,我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场,接下来我会出一道经典的后端面试题,你只需要进行 4 个简单的选择,就能判断出来你的水平是新手(3k)、初级(10k)、中级(15k)还是高级(30k)!

请听题:

题目

MySQL 数据库中的 count(1)、count(*)、count(字段)有什么区别?

在面试鸭上查看

请回答

1、它们在功能上有区别么?

A:有区别

B:没区别

答案

有区别。虽然在 MySQL 中,count(*)、count(1) 和 count(字段名) 都是用来 统计行数的聚合函数

但 count(*) 和 count(1) 会统计表中所有行的数量,包括 null 值(不会忽略任何一行数据);而 count(字段名) 只会统计指定字段不为 null 的行数。

恭喜答对的朋友,3k 的 offer 到手啦!

2、count(*) 和 count(1) 谁更快?

A:count(*)

B:count(1)

C:没区别

答案

效率一致,没区别。

关于 count(1) 和 count(*) 谁更快的问题,网上众说纷纭,如果背了不专业的八股文,可能答案就选错咯~

有点经验的程序员,在遇到不确定的问题时,当然要去源头亲自求证,得去看官网怎么说。如图:

官网表示 There is no performance difference ,即二者没有性能上的区别!

对于 count(字段) 的查询就是全表扫描,正常情况下它还需要判断字段是否是 null 值,因此理论上会比 count(1) 和 count(*) 慢。

但是如果字段不为 null,例如是主键或具有非空约束,那么理论上性能也差不多。而且本质上它们的统计功能不一样,在需要统计 null 的时候,只能用 count(1) 和 count(*),不需要统计 null 的时候只能用 count(字段),所以也不用太纠结性能问题。

恭喜答对的朋友,10k 的 offer 到手啦!

3、用 count(*) 统计有千万条记录的表的总数据量,快不快?

A:快

B:慢

C:其他

答案

这是一道简单的场景题,有经验的程序员,本能地会想到 具体情况具体分析

MySQL 有 2 个主流的存储引擎 MyISAM 和 InnoDB。

在 MyISAM 引擎中,有一个内部计数器来维护表的记录数,查询时可以直接返回表的行数,而无需扫描整个表,所以 count(*) 非常快。

但是在 InnoDB 引擎中无法维护记录总数,需要扫描整个表,所以表越大、记录越多,count(*) 就越慢。

为什么 InnoDB 引擎不维护记录总数呢?因为它支持行锁,会有很多并发修改表数据的操作,难以维护总数,还会带来额外的性能开销;而 MyISAM 只有表锁,对单个表的修改串行执行,所以能维护总数。所以要针对业务场景选择不同的 MySQL 引擎。

恭喜答对的朋友,15k 的 offer 到手啦!

4、InnoDB 引擎中,count(id) 和 count(二级索引) 哪个成本更低?

A:count(id)

B:count(二级索引)

C:其他

答案

count(二级索引) 通常成本更低。是不是没想到?

这是对上一问的进一步追问,虽然 InnoDB 引擎中 count(*) 统计总数性能不高,但它也针对这个操作进行了一定的优化。

id 通常是主键索引,在 InnoDB 中,主键索引是聚簇索引,它存储了实际的数据行。执行 count 时,InnoDB 需要遍历整个聚簇索引来统计行数。

二级索引是指存储了索引列和主键列的指针,而不包含实际的数据行。因此,二级索引相对来说更小。执行 count 时,InnoDB 只需要遍历这个较小的二级索引,而不是整个聚簇索引,需要读取的数据页更少,所以成本更低。

当然,理论归理论,具体情况具体分析,具体的性能差异取决于索引的大小和表的结构,可以用 explain 语句查看查询计划和成本。

恭喜答对的朋友,30k 的 offer 到手啦!

哦不对,恭喜摸到了 30k 的门槛,继续努力,说不定下一个技术专家就是你~

最后

通过这道题目可以发现,其实面试的时候,很多题目都是可以深挖的,挖的越深,越能体现出候选人的水平。

有同学表示:自己面试题目都答上来了,为啥还是通过不了?

别灰心,可能只是差点儿运气,同场面试有同学比你答的更深、表达更流畅罢了。

不管怎么样,大家在准备面试八股文的时候,有时间的话,多思考一点、再深入一点,自己也能学到很多东西。欢迎多到我们的 面试刷题神器 - 面试鸭 上看看。

你答对了几问呢?欢迎大家在评论区留言~

更多

💻 编程学习交流:编程导航
📃 简历快速制作:老鱼简历
✏️ 面试刷题神器:面试鸭

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024 年最值得阅读的 10 个外国技术网站
  • Linux网络-小结
  • mysql 分析慢查询
  • Opencv学习-图像翻转变换
  • SSM学生选课系统-计算机毕业设计源码99890
  • 中文网址导航模版HaoWa1.3.1/模版网站wordpress导航主题
  • <Qt> 常用控件
  • 使用labelme生成mask数据集(亲测可行)
  • 《学会 SpringMVC 系列 · 写入拦截器 ResponseBodyAdvice》
  • 《LeetCode热题100》---<5.③普通数组篇五道>
  • cf935:D.Seraphim the Owl(贪心)
  • c++入门基础(下篇)————引用、inline、nullptr
  • 爬虫:xpath模块及昵图网实例
  • 宏编程:C++宏、Rust宏和Lisp宏比较
  • [GWCTF 2019]我有一个数据库1
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [译]前端离线指南(上)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【Leetcode】104. 二叉树的最大深度
  • 10个确保微服务与容器安全的最佳实践
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Bootstrap JS插件Alert源码分析
  • css的样式优先级
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Facebook AccountKit 接入的坑点
  • gf框架之分页模块(五) - 自定义分页
  • happypack两次报错的问题
  • httpie使用详解
  • JavaScript 基础知识 - 入门篇(一)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Markdown 语法简单说明
  • mysql_config not found
  • PaddlePaddle-GitHub的正确打开姿势
  • Python进阶细节
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 闭包,sync使用细节
  • 给第三方使用接口的 URL 签名实现
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 微信小程序设置上一页数据
  • 学习HTTP相关知识笔记
  • 移动端唤起键盘时取消position:fixed定位
  • 阿里云API、SDK和CLI应用实践方案
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #VERDI# 关于如何查看FSM状态机的方法
  • #宝哥教你#查看jquery绑定的事件函数
  • (35)远程识别(又称无人机识别)(二)
  • (6)STL算法之转换
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (九)One-Wire总线-DS18B20
  • (十)T检验-第一部分
  • (学习日记)2024.01.09