今天刚好看到一个帖子,一位程序员对一位拥有8年资历的程序员大佬进行代码review时表示被吓到了
简单来说,就是看看哪些客户在本月得到了返利,并且将这些数据提取出来。大佬写的这段代码实现了需求,但写法真是别具一格,独树一帜。代码解析
首先,这段代码使用了几个动态SQL片段,主要包括:- 判断 partyName 是否为空,并根据条件进行相应查询。
- 使用 YEAR(NOW()) 和 MONTH(NOW()) 函数来过滤返利确认日期。
深入分析
咱们程序员在编写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)
这种写法可以确保查询条件能用到索引,大大提高查询效率。这样一来,既能满足需求,又能保证代码的执行性能。
很多人看到这里可能会说,这样写代码会阻止优化器利用索引,那是不是就不能这么写了?他采用这种写法,可能是在权衡了实现难度和性能之后的选择。简单直接的写法在开发初期可以快速实现需求,并且在数据量不大时,性能影响并不会很明显。但是,作为程序员,特别是有多年经验的大佬,在实现功能的同时,也需要考虑到代码的可维护性和性能优化。这段代码的写法,虽然达到了需求,但在后期的性能优化上会带来不小的挑战。养寇自重?
有人调侃说,这是在“养寇自重”,为后期优化做埋点。其实,这是一种比较片面的看法。好的代码不仅要实现需求,还要考虑到未来的扩展和优化。程序员不仅仅是“写代码的人”,更是“设计系统的人”。在代码的每一行中,如何做到既满足当前需求,又为未来的优化留出余地,是我们需要不断思考的问题。网友评论
有网友说:“你刚毕业的吧?这么较真,都迟早是要失业的人,别把自己太当回事。”
确实,作为新手,可能会对每一行代码都精雕细琢,追求极致的性能优化。但随着经验的积累,我们也需要学会在复杂度和性能之间找到平衡。东哥觉得,这段代码的写法虽然有些问题,但也反映了程序员在不同阶段的思维差异。我们需要尊重每一位程序员的选择,同时也要不断学习和改进,毕竟代码是一个不断迭代优化的过程。希望大家能在评论区分享你们的看法和经验,让我们共同进步。目前,对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥
资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB。全部免费领取!全面满足各个阶段程序员的学习需求。