当前位置: 首页 > Linux

缓存+数据库,这就解释了为什么sql不要加入太多,面试不会让你等通知

时间:2023-04-06 05:35:25 Linux

来发分题再去一家公司面试,幸好遇到了一个很好的面试官,但是这个哥们也瘦得差点把他带进沟里。面试的时候,他问了我这两个问题。第一个是,你用过Linux吗?我也心想,这位大哥在想什么?linux不就是现在开发者的基本操作吗?不过后来,我就后悔了,这可是笑面虎啊,我不这么玩的,他问我几句命令,你用free了吗?你知道什么内容是免费的吗?我的清除缓存命令会被在线处理吗?鬼子问了三遍,我就去,但是这个太简单了,简单回答了下,不过最后一题,没想到是个坑爹的问题:sync;echo3>/proc/sys/vm/drop_cacheswilldobuff/cache清空了,在线执行这个命令能告诉我吗?答:有很大的好处。清除缓存后,我们会有更多的可用内存空间,就像PC端xx卫士的小火箭一样,点一下,就会释放大量内存(暗喜,送分题,这是不是吧)面试官:嗯……,回去等通知吧。SQLJoin,我去,我去弄个饭盒,怎么可能,巧了我就问,为什么?面试官心情应该不错,胡总把我气笑了。..面试官:我们换个话题,谈谈你对join的理解。我:好吧(再答错就完了,把握机会。)回想一下,SQL中的join可以组合指定的表,按照一定的条件组合数据。返回客户端join的方式有innerjoin、innerjoin、leftjoin、leftjoin、rightjoin、rightjoin、fulljoin。Fulljoin面试官:如果在项目开发中需要使用join语句,如何优化和提升性能?我:有两种情况,数据规模小,数据规模大。采访者:然后呢?我:对于1,数据量小,全部存在内存中。2、数据量大。您可以增加索引以优化连接语句的执行速度。您可以使用冗余信息来尽可能减少连接数。减少表连接数,一条SQL语句中的表连接数不要超过5条。面试官:可以得出结论,连接语句是比较耗性能的吧?我:是的面试官:为什么?Buffer我:在执行join语句的时候肯定有一个比较的过程面试官:是的我:两张表一张一张比较的语句比较慢,所以我们可以把两张表中的数据依次读入一个内存块。以MySQL的InnoDB引擎为例,我们肯定可以通过下面的语句找到相关的内存区域。showvariableslike'%buffer%'如图,join_buffer_size的大小会影响我们join语句的执行性能面试官:除此之外呢?一个大前提:任何项目最终都会上线,必然会产生数据,而且数据的规模不能太小。面试官:就是这样。I:Big有些数据库中的数据最终会保存到硬盘中,以文件的形式存储。以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会把内存当作一个HardDiskCache面试官:现在你知道怎么回答子题了吗?我:我……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,或更改为固态驱动器。觉得有帮助的朋友,帮忙关注+点赞,谢谢,或者关注原文公众号:Java架构师联盟