关于 MySQL 函数效率的疑问

2021-11-18 16:40:51 +08:00
 gadfly3173

在清理公司旧代码时顺便做点性能优化,发现公司里有很多业务在用

select date_format(create_time, '%Y-%m-%d') dateDay, count(*) count
from table
GROUP BY date_format(create_time, '%Y-%m-%d')
ORDER BY date_format(create_time, '%Y-%m-%d')

这样的语句全表扫描+日期转换。一个 47 万行的表这么跑一遍差不多 550-600ms 。而当我用 date(create_time) 换掉之后,耗时就会降到 230-300ms 。类似的还有用 CONCAT(YEAR(create_time), '-', MONTH(update_time)) dateMonth 替换 date_format(create_time, '%Y-%m') 之后,耗时也能减少 30%以上。对于 mysql 来说, date 这样的函数是比 date_format 的效率高出非常多的么?

1552 次点击
所在节点    MySQL
2 条回复
gadfly3173
2021-11-18 16:46:47 +08:00
CRVV
2021-11-18 17:33:41 +08:00
date 函数做的时候基本上就是 timestamp / 86400 ,另外考虑一下闰秒,最多几次加减法吧

date_format 是 itoa(timestamp/365/24/3600) + itoa(timestamp/30/24/3600%(365*24*3600)) + ......
还要考虑闰秒加闰年闰月这些

哪个函数更快应该很明显了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/816330

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX