首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
要暴富的打工人很高大
北京现代职业技术学院 数据分析师
发布于北京
关注
已关注
取消关注
🐎
@Error小志Exception:
SQL优化 硬控面试官半小时
烫
SQL优化可以串联 MySQL 90%的知识点,讲的好的话,可以让面试官眼前一亮,是很加分的,特别是对于那些本身就很懂MySQL的面试官,基本这次面试就稳了。这里我总结了一些SQL优化的思路,供大家参考,基本覆盖99%的场景了。PS: 如果对你有用的话,请不要吝啬你的花花,这是我分享的动力[羞涩] 如何定位慢SQL(场景)业务场景执行时间非常久,触发网关超时使用以下命令分析慢SQL日志:`mysqldumpslow /path/to/your/slow-query.log`优化思路增删查改对于插入可以把多个语句合并成一个语句批量处理。对于删除,因为删除是假删除(减少B+树合并访问磁盘的开销),如果有太多地方没有使用,B+树层数虚高,增加了访问磁盘的速度,并且全表扫描也会扫描到很多无用数据,可以在数据库空闲的时候通过alter table来重建表使数据排列更紧凑对于频繁修改的数据利用最左匹配原则减少索引数量如果有唯一索引可以考虑改成普通索引,避免修改时为了维护唯一性导致change buffer失效。对于查询: 使用缓存, 早期mysql开启查询缓存,mysql8.0没有查询缓存,业务层可以使用缓存例如redis;或者可以把一些特殊的语句定期执行然后保存,后面查保存的数据,不用执行sql,比如我之前做的一个预测成本的功能,每月只需要预测一次,那就可以写一个定时任务每个月定时预测一次保存到另一张表,后续查询直接查这张表就可以了,就不用执行复杂SQL了。对于大数据量的场景,可以读写分离,分库分表分析执行计划EXPLAIN分析SQL语句的执行计划,主要关注以下几个字段如果type为ALL,说明进行了全表扫描,考虑是否可以通过增加索引来优化。分析possible_keys (可能使用到的索引)和key(实际使用的索引),确保相关的列上建立适当的索引并且正确选取索引。使用覆盖索引来避免回表使用复合索引来提高多条件查询的性能(索引下推)。利用最左匹配原则尽可能的建立更少的索引分析有没有没有正确选取索引:可能会错误的使用全表扫描的场景:对字段使用了函数:将函数写在判断条件上面,避免对字段使用函数。字段隐式类型转换( str->int, 字段使用了utf8但是字符是utf8mb4),需要保证查询目标与字段类型一致如果没有出现上述问题,还有一种解决思路:使用force index强制使用索引 | order by .. limit 1。因为选取索引是优化器的工作,优化器会分析选取索引的扫描行数加上回表的代价是否比主键全表扫描少,这里采用采样分析,因为全表分析代价太大,在多个事务的时候,因为是假删除而且多个事务的时候MVCC多版本数据在undo-log里面,这个时候采样分析会把已经删除的数据也考虑到总量里面去,比如实际上总量是1000行,考虑成了2000行导致考虑的扫描行数翻倍。所以采样分析针对高并发和大数量的场景是非常不准的MySQL临时表, CTE会破坏索引结构(例如group后使用了临时表):想办法优化掉临时表,或者减少临时表的查询、JOIN操作rows字段,表示查询的结果集行数。我们要尽可能的减少rows的数量,以下是一些思路确保查询条件尽可能具体, 例如在WHERE子句中使用更严格的条件。对于确定的数量(例如只需要查询一个结果)使用limit in 替换成 exists,in 是 双重匹配,exists匹配到了一个后就会提前返回count字段看可不可以替换成count( * ), count(1)Extra字段,记录一些额外信息如果有Using filesort,表示使用了文件排序。可以考虑给需要排序的字段加上索引,因为索引使用的B+树本来就是排序好的,可以减少排序时间。 或者可以把单次排序的内存sort_buffer_size设置大一点,因为排序是取磁盘里的部分数据到内存进行排序最后合并, 把单次排序内存设置大一点这样减少IO次数如果有Using Join Buffer, 说明Join没有使用索引。没有索引join会用到Block Nested-Loop Join算法,时间复杂度很高,可以看作两层遍历,实际上更复杂一点,考虑到数据很多不能全读到内存里,mysql使用了join_buffer来存一部分数据,可能会因为 join_buffer 不够大,需要对被驱动表做多次全表扫描。在需要Join的字段加上索引其它思路对于某些语句正常执行的时候很快,偶尔执行时间会很长,很难复现。这是因为触发了flush操作,我们应该尽可能的去减少flush操作触发的次数。如果频繁触发flush操作,可能是脏页比例过高,可以查看脏页比例,脏页比率控制策略主要与redo-log大小和写盘速度(innodb_io_capacity)有关,我们需要设置合理的redo_log大小以及符合实际的预期写盘速度(可以通过 fio 这个工具来测试)。我们也可以想办法减小单次flush操作的时间,InnoDB有个策略是刷某一页时发现这一页旁边的页也是脏页也会去刷旁边的页,这样连带着一片都刷进去,导致一次flush操作可能会耗费很长的时间,我们可以通过innodb_flush_neighbors来控制这个行为,值为 1 的时候会有上述的“连坐”机制,值为 0 时表示不找邻居,自己刷自己的。设计表的时候, 使索引的长度尽可能小,页的大小是固定的,根据索引长度计算B+树阶数,阶数越小,每页的节点数越多,B+数深度越小,访问磁盘次数越少;对于事务,使修改的顺序尽可能靠后,因为修改会持有行锁,会等事务提交后再释放锁,这样可能会阻塞其他事务,修改靠后就可以更晚的持有这些锁,这样就可以减少阻塞,也可以减少死锁发生的概率。大数据量分页查询的优化,改成使用id:分页的原理是查询到第一个满足条件的数据行后往后一页一页遍历,如果改成id的话,就可以使用索引进行优化,直接定位到需要查询的那一页CTE物化问题,部分数据库(如MySQL)将CTE处理为临时表时不会保留原表索引, 解决方法:修改逻辑避免使用CTE/使用临时表替换CTE, 并在临时表上加索引(空间换时间)CTE(Common Table Expression 公共表表达式) 是一种在 SQL 查询中定义临时结果集的方法。它通过 WITH 子句创建,可以:简化复杂查询的可读性支持递归查询多次引用同一结果集基础语法WITH cte_name (column1, column2, ...) AS ( -- 子查询 SELECT ...)SELECT * FROM cte_name;我的面试思路一般结合一两个点来讲比如 Join 没有使用索引,耗时很长,但是后续分析发现Join字段上建立了索引,为什么Join没有选取索引呢?最终分析发现了以下原因:临时表破坏了原表的索引结构CTE物化问题破坏了原表的索引结构再针对上述问题讲解一些优化思路。PS: 此文章适合有一定SQL优化基础的人进阶使用,对于小白可能不是很友好,如果你有什么疑问的话,可以在评论区我们相互交流一下。(因为每个知识点都要展开讲的话基本覆盖了90%MySQL知识点了,篇幅太长)最后,如果对你有用的话,一定不要忘记送个花花呀[羞涩],这么高质量又免费的帖子很少了[赞]
点赞 309
评论 52
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
04-24 09:48
蚌埠坦克学院 嵌入式软件开发
这样写嵌入式简历夯爆了
找嵌入式工作,很多人不是能力不够,而是简历一上来就写乱了。嵌入式简历和其他岗位不一样,招聘方最想看的不是你会不会写漂亮话,而是你做过什么平台、用过什么芯片、熟不熟协议、有没有项目落地经验。所以简历模板一定要解决一个核心问题:让面试官一眼就能抓到你的技术栈、项目经历和岗位匹配度。这套模板为什么好用?个人信息放在最上面,求职意向直接写清楚不绕弯子,面试官打开就知道你投的是嵌入式软件开发,不会让人猜。专业技能单独成块,技术关键词集中展示像 STM32、FreeRTOS、UART、SPI、I2C、CAN、MQTT 这些内容,最好前置。因为嵌入式岗位筛简历,本质上就是先扫芯片、协议、系统、工具链。教育背...
点赞
评论
收藏
分享
04-23 10:54
已编辑
门头沟学院 算法工程师
友友们 来一场关于阿里、多益、字节 的 Agent开发 的模拟考试吧(点赞过10发答案)
都是楼主亲自手动复制粘贴准备的~题目数量:20关键词:Agent开发粗分类:全部难度:全部1. 选择题关于数据结构中的堆(Heap),下列说法正确的是:A. 堆通常使用完全二叉树实现;在最大堆中,任一节点的值都不小于其子节点的值B. 堆是一种严格有序结构,因此对堆进行中序遍历一定能得到全局有序序列C. 最小堆中,任一节点的左子树所有节点都小于右子树所有节点D. 堆必须使用链式存储,不能使用数组高效实现2. 选择题在 Linux 中,命令 ps -ef | grep java 最常用于完成以下哪项操作?A. 查看当前系统中与 java 相关的进程信息B. 统计 java 目录下文件的磁盘占用情况...
面试问题记录
点赞
评论
收藏
分享
03-27 13:42
北京交通大学 算法工程师
遇到一个民科乐子,最难绷的一集。
GoldenPota...:
能做这个方向的人200一天是吧🤗
找AI工作可以去哪些公司...
点赞
评论
收藏
分享
04-16 10:50
北京理工大学 前端开发其它
地铁上看到一个小学生刷leetcode
今天早高峰10号线,人挤人,我好不容易站稳,余光扫到旁边座位上有个穿校服戴红领巾的小男孩,正低头盯着iPad。我以为他在看动画片,好奇瞟了一眼——好家伙,在刷leetcode。我人都傻了。我小学五年级还在玩赛尔号,人家已经在地铁上刷题了。让我想起来现在也有很多机构推出面向小孩的人工智能课、AI使用课...现在连小孩都这么卷了吗?
牛客97239692...:
这感觉是我弟上的那种编程课,感觉纯是骗家长小孩子的,咋劝家里都不听
AI时代还有必要刷lee...
点赞
评论
收藏
分享
04-21 14:16
已编辑
门头沟学院 C++
腾讯IEG暑实timeline(已offer)
游戏客户端,意向base上海3.12 官网投递(3.18 收到光子面试邀约)3.19 光子(深圳)一面。很有趣,面试官上来就说没看到我的意向base是上海,然后问要不要面。想了想腾讯会议开都开了就面一下,不过因为太久没刷题知道自己手撕表现得不好,面了几十分钟就和面试官say bye bye了。(3.21 收到光子流程结束邮件,3.24 收到北极光面试邀约,提供26号or27号的面试,选择了26号)3.26 北极光一面。完美发挥。(3.27 收到北极光二面邀约)3.30 北极光二面。(4.2 云证 + 收到北极光hr面试邀约)4.7 北极光hr面竟然是深圳总部的hr,乖乖...4.8 转录用评估...
我的求职进度条
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
求问:有没有真的能上手做大模型/Agent的实战项目?
1.2W
2
...
巨人网络26春招游戏策划面经,已OC
8592
3
...
巨人网络游戏开发一面面经
6248
4
...
Agent面试-RAG篇
5415
5
...
游戏客户端的碎碎念
4944
6
...
我的前途全被学校毁了!!!
1995
7
...
tme暑期前端二面 4.27
1867
8
...
#网易游戏雷火笔试#题量好大,个人能力原因吧,现想现写好多没有写完...
1828
9
...
同程旅行java二面
1660
10
...
三道手撕?字节后端三面你别太离谱!
1467
创作者周榜
更多
正在热议
更多
#
如果春招能重来,我会___
#
2866次浏览
22人参与
#
面试官拷打AI项目都会问什么?
#
874次浏览
24人参与
#
联宝杯大学生创新大赛,你的技术值得产业级答案
#
26918次浏览
476人参与
#
除了线上,还能去哪些地方投简历
#
1833次浏览
20人参与
#
你觉得最好用的AI编程工具是_
#
521次浏览
18人参与
#
你会因为行情,降低找工作标准吗?
#
4030次浏览
30人参与
#
mt对你说过最有启发的一句话
#
114880次浏览
867人参与
#
你的mentor是什么样的人?
#
61413次浏览
794人参与
#
如何排解工作中的焦虑
#
321509次浏览
2756人参与
#
你和你的mentor相处模式是__
#
4670次浏览
34人参与
#
实习第一天,你在干什么
#
2904次浏览
20人参与
#
双非本科的出路是什么?
#
230569次浏览
1655人参与
#
技术岗笔试题求解
#
116047次浏览
1122人参与
#
机械校招之路总结
#
125321次浏览
2106人参与
#
你有哪些缓解焦虑的方法?
#
60702次浏览
914人参与
#
宣讲会你有哪些意向不到的收获
#
25119次浏览
80人参与
#
听到哪句话就代表面试稳了or挂了?
#
266049次浏览
1722人参与
#
你收到了团子的OC了吗
#
1603376次浏览
11858人参与
#
选offer应该考虑哪些因素
#
168968次浏览
1050人参与
#
一觉醒来,秋招难度下降一万倍……
#
147708次浏览
786人参与
#
0offer互助地
#
774904次浏览
4766人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务