嗨,我是东哥。
今天刚好看到一个帖子,一位程序员对一位拥有8年资历的程序员大佬进行代码review时表示被吓到了
话不多说,先上代码截图:
这段代码的需求是查询本月的客户返利信息。
简单来说,就是看看哪些客户在本月得到了返利,并且将这些数据提取出来。大佬写的这段代码实现了需求,但写法真是别具一格,独树一帜。
# 代码解析
首先,这段代码使用了几个动态SQL片段,主要包括:
判断 partyName 是否为空,并根据条件进行相应查询。
使用 YEAR(NOW()) 和 MONTH(NOW()) 函数来过滤返利确认日期。
使用了一些基本的条件判断和连接操作。
加我领取Java架构师资料合集
# 深入分析
乍一看,这代码实现了需求,但问题却藏在细节里。
咱们程序员在编写SQL查询时,往往会考虑查询性能,特别是如何利用索引来提高效率。然而,这位大佬在列上使用了函数(YEAR() 和 MONTH()),导致了无法利用索引的问题。
技术评论:在列上使用函数会阻止优化器利用索引,因为索引是基于列的原始值建立的,而函数改变了这些值的表示方式。这就导致无法直接匹配索引中的条目,需要执行全表扫描来查找匹配的行,从而大大增加了查询所需的时间和资源。
# 代码优化建议
为了解决这个问题,可以将日期过滤条件改为范围查询,这样就能充分利用索引。例如:
AND crr.rebate_confirm_date >= DATE_FORMAT(NOW() ,'%Y-%m-01')
AND crr.rebate_confirm_date < DATE_ADD(DATE_FORMAT(NOW() ,'%Y-%m-01'), INTERVAL 1 MONTH)
这种写法可以确保查询条件能用到索引,大大提高查询效率。
这样一来,既能满足需求,又能保证代码的执行性能。
很多人看到这里可能会说,这样写代码会阻止优化器利用索引,那是不是就不能这么写了?
其实不然。这位大佬的思路其实是很有意思的。
他采用这种写法,可能是在权衡了实现难度和性能之后的选择。简单直接的写法在开发初期可以快速实现需求,并且在数据量不大时,性能影响并不会很明显。
但是,作为程序员,特别是有多年经验的大佬,在实现功能的同时,也需要考虑到代码的可维护性和性能优化。
这段代码的写法,虽然达到了需求,但在后期的性能优化上会带来不小的挑战。
# 养寇自重?
有人调侃说,这是在「养寇自重」,为后期优化做埋点。
其实,这是一种比较片面的看法。好的代码不仅要实现需求,还要考虑到未来的扩展和优化。
程序员不仅仅是「写代码的人」,更是「设计系统的人」。在代码的每一行中,如何做到既满足当前需求,又为未来的优化留出余地,是我们需要不断思考的问题。
网友评论
在网上,关于这段代码的讨论也是热火朝天。
有网友说:「你刚毕业的吧?这么较真,都迟早是要失业的人,别把自己太当回事。」
确实,作为新手,可能会对每一行代码都精雕细琢,追求极致的性能优化。但随着经验的积累,我们也需要学会在复杂度和性能之间找到平衡。
东哥觉得,这段代码的写法虽然有些问题,但也反映了程序员在不同阶段的思维差异。
我们需要尊重每一位程序员的选择,同时也要不断学习和改进,毕竟代码是一个不断迭代优化的过程。
希望大家能在评论区分享你们的看法和经验,让我们共同进步。
发送关键字「 java 」,领取Java架构师资料合集
热门推荐