当前位置: 首页 > 科技观察

面试官:为什么代码规范要求SQL语句不要加入太多?

时间:2023-03-21 11:04:39 科技观察

发送子问题面试官:你操作过Linux吗?我:是的面试官:我应该用什么命令查看内存使用情况我:freeortop面试官:那你说用free命令会看到什么信息我:然后,如下图,可以看到theusageofmemoryandcachetotaltotalmemoryusedusedmemoryfreefreememorybuff/cacheusedcacheavailableavailablememory面试官:那你知道怎么清理了吗你用过缓存(buff/cache)吗?我:嗯……我不知道。面试官:同步;echo3>/proc/sys/vm/drop_caches可以清除buff/cache。告诉我,我在线执行这个命令你做得好吗?我:(送分题,喜出望外)好处真大。清除缓存后,我们就会有更多的可用内存空间,就像PC上xx卫士的小火箭一样。单击它,它将被释放。有很多内存。面试官:em....,回去等通知再说SQLJoin面试官:换个话题,谈谈你对join的理解。(1)回想一下SQL中的join可以将指定的表按照一定的条件组合起来返回给客户端。有内连接、内连接、左连接、左连接、右连接、右连接和全连接。全连接面试官:如果在项目开发中需要用到连接语句,如何优化和提升性能?我:有两种情况,数据量小,数据量大。采访者:然后呢?我:如果数据量小,所有的数据都会存在内存中。如果数据量很大,可以增加索引来优化join语句的执行速度。您可以使用冗余信息来减少连接数并最大程度地减少表连接数。次数,一个SQL语句表的连接次数不能超过5次。面试官:可以断定join语句是比较耗性能的吧?我:是的面试官:为什么?(2)BufferMe:执行join语句的时候肯定有一个比较的过程面试官:是的Me:两张表一张一张比较的语句比较慢,所以我们可以把两张表的数据依次读入一个内存块.以MySQL的InnoDB引擎为例,我们肯定可以通过如下语句找到相关的内存区域:showvariableslike'%buffer%'如下图join_buffer_size会影响我们join语句的执行性能。面试官:还有什么?(3)一个大前提:任何项目最终都会上线,必然会产生数据,而且数据规模不能太小。面试官:是这样的:数据库中的大部分数据最终都会保存到硬盘中,以文件的形式存储。以MySQL的InnoDB引擎为例。InnoDB使用页面作为基本的IO单元。每页的大小为16KB。InnoDB会为每个表创建一个.ibd文件来存储数据。验证我:这意味着我们有多少个连接表需要读取多少文件?虽然可以使用索引,但是频繁移动硬盘的磁头还是不可避免的。采访者:也就是说磁头经常移动会影响性能,是吧?我:是的,现在的开源框架不是都喜欢说你通过顺序读写对性能有很大的提升,比如hbase,kafka面试官:你说的对,你觉得linux对这个有优化吗?tip,可以再执行free命令看看我:奇怪为什么缓存占用1.2G多面试官:有没有想过buff/cache里存的是什么?为什么buff/cache占用那么多内存,还有1.1G的可用内存?为什么可以用两个命令来清理buff/cache占用的内存,而只能通过结束进程来releaseused?产品,你想了几分钟后:我只是随便释放了buff/cache占用的内存占用的内存意味着它不重要,清除它不会影响系统的运行。面试官:不完全是我:是吗?回想《CSAPP》(深入理解计算机系统)的一句话说,内存层次结构的本质是每一层存储设备翻译成人类的话就是下层设备的缓存,也就是说Linux会把内存当成硬盘缓存面试官:现在你知道怎么回答子题了吗?我:我...(4)Join算法面试官:再给你一次机会,如果让你实现Join算法,你会怎么做?做?我:如果没有索引,嵌套循环就搞定了。如果有索引,可以使用索引来提高性能。面试官:说到join_buffer,你觉得join_buffer里面存储的是什么?我:在扫描过程中,数据库会选择一个表返回,需要和其他表进行比对。将比较后的数据放入join_buffer面试官:有索引的时候怎么处理?我:这个比较简单。只需读取两个表的索引树并进行比较即可。下面介绍一下非索引处理方式NestedLoopJoin嵌套循环,一次只读取表中的一行。数据,也就是说outerTable有10万行数据,innerTable有100行数据,需要读取1000万次(假设这两个表的文件没有被操作系统缓存到内存中,我们称它们为冷数据表)当然现在没有数据库引擎使用这种算法(太慢了)BlocknestedloopBlockblock,也就是说每次取一条数据到内存中,减少I/O开销。当没有索引可以使用时,MySQLInnoDB将使用该算法考虑以下两个表t_a和t_b。当无法使用索引进行join操作时,InnoDB会自动使用Blocknestedloop算法进行汇总。上学的时候,数据库老师最喜欢考数据库范式,到上班才学全。性能为准,能冗余就冗余。如果不能冗余,加入确实影响性能的话就加入。尝试增加join_buffer_size,或更改为固态驱动器。