90% 的数据分析师忽略了这个 SQL 概念

大多数人都是通过 网课教程、训练营或在工作中实践来学习 SQL,那你是否有问过“数据库实际上是如何执行这个查询的?"

如果没有的话,也不用担心,因为这就是 90% 的分析师都会忽略的概念——查询执行策略。

SQL的背后,是查询规划器和执行引擎在做决策。如果你不了解 SQL 的幕后运行机制,你的查询可能会变得更慢,也更难扩展。

举个例子,两个查询做同样的事情,你试试看是不是其中一个查询的运行速度更快?

方式一:

SELECT customer_id,

(SELECT COUNT(*)

FROM orders o

WHERE o.customer_id = c.customer_id) AS total_orders

FROM customers c;

方式二:

SELECT c.customer_id, COUNT(o.order_id) AS total_orders

FROM customers c

LEFT JOIN orders o ON o.customer_id = c.customer_id

GROUP BY c.customer_id;

方法一更慢,因为它使用的是子查询,会对表中的每一行都运行一次检查,而第二个方式则是使用了数据库的优化链接,一次性完成数据聚合。

SQL 不仅仅是获得正确的结果, 任何人都可以编写有效的查询, 但只有优秀的分析师才能编写高效、可扩展且可读的查询。一旦你了解了执行引擎的工作原理,就会开始发现自己代码中以前从未注意到的错误。

以下是几个经验教训:

  1. 避免对大表使用相关子查询, 尽可能使用 JOIN 或 CTE 。
  2. 如果查询花费的时间超过 3 秒,请查看执行计划,寻找嵌套循环(不适合大型连接)& 表扫描(可以通过索引进行优化)
  3. 像迷你 DBA 一样理解索引,检查缺失的索引,了解集群与非集群,优化索引列的 WHERE 子句
  4. SQL 不仅仅与输出有关,它还与可维护性有关,注意清晰表达,合理使用别名,注释复杂的逻辑。

---

我是钱德勒(chandler_is_dreaming),拥有超10年全球顶尖企业数据运营与商业分析实战经验,曾任职于多家头部互联网及国际知名企业,历任商业运营总监、商业智能负责人、数据分析高级经理等职。具备丰富的数据分析实战经验,曾成功从0搭建团队、优化流程、推动数字化转型,最多管理60余人的数据团队,累计面试超300人,尤其擅长数据相关岗位(如数据分析师、商业分析师、运营分析师、数据产品经理等)的职业规划、简历优化、技能提升、业务思维、面试技巧等。

钱德勒,拥有超10年全球顶尖企业数据运营与商业分析实战经验,曾任职于Amazon等国际头部企业,历任商业运营总监、商业智能负责人、数据分析高级经理等职。具备丰富的数据分析实战经验,曾成功从0搭建团队、优化流程、推动数字化转型,管理60余人的数据团队,累计面试超300人,尤其擅长数据相关岗位(如数据分析师、商业分析师、运营分析师、数据产品经理等)的职业规划、简历优化、技能提升、业务思维、面试技巧等。

全部评论

相关推荐

06-15 00:30
已编辑
门头沟学院 Java
昨天晚上收到电话的面试邀约很激动,也很害怕,害怕自己抓不住机会,但是面试的时候面试官超级好,人特别好,有不会的面试官会给你提示,同时还会给你肯定的回应。下面是一些面试经历:💻面试岗位:java后端开发❓面试问题:JVM:1.JVM的内存模型以及垃圾回收5个内存模型+4种回收算法2.JVM的内存模型中哪些是共享的,哪些是私有的集合:1.看过哪些集合的源码?答:看过ArrayList2.根据你看过的源码,讲述一下add()方法的3.在项目中你会用ArrayList储存一个经常变动的数据吗?4.map顶层的接口实现类有哪些?(答:HashMap的一些底层原理)5.HashMap的put方法介绍一下并发编程:1.锁的介绍,你用什么锁?介绍一下(项目中的悲观锁锁表,乐观锁)2.对Syconized和lock的区别?3.Synchronized的锁升级机制?4.偏向锁(可重入锁,有个标记点),轻量级锁实际是怎么实现?5.线程池你有用到过吗?(项目中的逻辑过期用到的线程池)6.你用到的线程池你是自己定义的还是线程池自带的?(自带的线程池,队列的最大值是自己设置的,会消耗内存)7.线程池你是自己自定义的,你是怎么考虑的,线程的核心线程数,最大线程数,阻塞队列?框架:1.spring,springBoot,springcloud他们之间的关系,你可以讲述一下吗?2.概述一下spring IOC和Aop3.单例的循环依赖简述一下?(三级缓存)数据库:1.数据库的范式概述一下?(我说了三大范式,面试官补充说现在已经不止三大范式了,变成5个了)2.Mysql的基本调优你有接触过吗?(讲到了索引失效)3.什么情况索引失效?4.我更想知道你调节SQL的时候你发现比较慢,你会怎么一步步发现慢在哪一点?(排查SQL,数据库执行的排查计划)项目:1.两个项目中你哪个项目中参与比较深?2.项目中遇到的问题和项目中的亮点?(开放性思维)3.项目中你用到了redission,你对什么进行加锁的,是某个对象还是某个标识(库存行id)?🙌面试感想:面试之前很紧张,也没想过能过,就当是一次经验,面试官人很好,给了很多建议,关于八股这些,让我多看,多整理一下代码的底层原理。最后告诉我,在他那我算是过了,之后还有主管面,HR面,最后他和我说,他这里不是菜鸟的正式岗位,是什么红林计划?执管岗位,不是菜鸟正式岗位,当时没记太清,也没问清楚,之后主管面要是过了的话,再问问,希望后面的面试顺利吧。
半夏夏柳:跟我面的同一个菜鸟外包,面的人估计都一样😂
查看24道真题和解析
点赞 评论 收藏
分享
6.9一面:手撕:打家劫舍实习拷打:1、选择什么结构存储日志数据,存储在哪里的2、日志记录请求量大概多少,如果高并发场景下可以用什么进行优化3、zset查询命令八股拷打:(忘记录音了 只记住部分)1、说一下mysql存储引擎有哪些2、mysql索引有哪些3、mysql索引失效场景4、update s set x=5 where id>5 会用什么锁?临键锁是怎么锁起来的?如果是按x查询呢?5、当前读和快照读6、快照读为什么无法防止幻读的发生7、mysql事务隔离级别8、描述一下一条sql语句查询的过程9、mysql为什么要分为server层和存储引擎层6.10二面:实习/项目拷打:1、项目和实习的来源?2、介绍一下实习中做了哪些事情?你认为实习与在学校做的项目有什么区别?3、简历上写了实习中排查优化30%,这个数据怎么得到的4、举例子说明一下你做的优化对bug排查效率的提升?运维人员如何去排查的?5、如何实现的日志记录审计(aop 线程池)6、记录的日志数据存储在哪里了?怎样存储的?7、冷数据都直接存储在mysql会导致性能问题,有没有其他更好的方法?mysql对应表上打了哪些索引?8、系统每天的请求量有多少?9、热数据怎样存在redis中的?利用zset能够快速根据key(时间戳)进行时间范围查询日志,那如果是按用户id查询呢?你用redis存储日志的热数据,如何处理redis宕机的情况?10、项目/实习中多线程情况的解决,举例子说一下八股:1、介绍一下hashmap?2、如果此时一个对象没有重写equals方法,作为key,put到hashmap中,会产生什么问题?3、如何实现把hashmap的数据按key排序,可以利用其他的数据结构也可以在hashmap上实现,有哪些方法?手撕:lc 560其他:对工作地点有什么要求吗,多久到岗,介绍一下acm经历………..6.12三面八股1、redis是单线程的为什么还这么快?2、讲一下IO多路复用底层原理?(不会3、tcp和udp区别?怎么理解udp可以广播/一对多,在tcp协议基础上我开多个tab网页不是一对多吗?4、输入一个url链接访问网页的过程?讲一下dns域名解析过程?手撕1、有红、黄、蓝三种颜色的球,峡谷有n步,每一步放一个球。当连续的三个球的颜色是红、黄、蓝的某种排列(如红黄蓝、红蓝黄、黄红蓝等)时,会发生爆炸。问有多少种放置球的方式,使得不会发生爆炸。解:三维dp记录状态,由前两格状态后推。2、给你一个链表,奇数节点正序,偶数节点逆序,且奇数节点和偶数节点没有关系,时间复杂度O(n)、空间复杂度O(1)实现将链表变成总体有序。解:先拆分链表为奇数链表和偶数链表,再反转偶数链表,再把两个有序链表合并为一个有序链表。(感觉是多个力扣题杂交?)其他1、在生活/学习/工作中,有遇到哪些问题看法是和别人不一样的?6.16hr面全程十分钟先是自我介绍然后就是几个简单的问题:1、多久可到岗 出勤时间2、介绍一下实习经历3、有没有拿过奖学金4、平时通过什么学习技术5、是否有转正诉求反问:1、部门体系结构(不方便说2、薪资待遇3、面试结果多久出(回答一周内,说是周三周四可询问offer4、转正考核方式面试完过了一会,面试官打电话询问base意愿6.17上午 offer
Huner_:都现在了,实习一个月秋招了,你怎么安排,老兄
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务