mysql~date_format性能问题

这篇具有很好参考价值的文章主要介绍了mysql~date_format性能问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在mybatis的xml中使用MySQL的DATE_FORMAT 函数可以将日期类型的数据格式化为字符串。然而,尽管这个函数很方便,但在处理大量数据时可能会引起性能问题,特别是在复杂查询中。这是因为 DATE_FORMAT 函数的计算是在数据库引擎层级进行的,而不是在应用程序代码中。

以下是一些关于 DATE_FORMAT 函数可能引起性能问题的情况和建议:

  1. 索引失效: 如果你在查询中使用 DATE_FORMAT 函数,并且这个查询是在一个日期字段上进行的,那么可能会导致数据库无法有效使用索引。这是因为函数的计算会导致数据库无法直接比较原始字段的值,从而无法使用索引加速查询。

    解决方案: 尽量避免在索引字段上使用 DATE_FORMAT 函数。如果需要按照格式化后的日期进行查询,可以考虑在表中存储格式化后的日期字符串,并在查询时使用该字段。

  2. 查询性能下降: 大规模数据上的 DATE_FORMAT 函数使用可能导致查询性能下降。这是因为数据库需要逐行执行函数计算,这会增加查询的处理时间。

    解决方案: 尽量在应用程序层对日期进行格式化,而不是在数据库查询中使用 DATE_FORMAT 函数。这样可以将计算转移到应用程序代码中,减轻数据库的负担。

     // 在java应用程序中进行日期换算,将前端传进来的日期时间格式化为日期,再endTime时间条件时,进行加1天的计算,时间都为0点0分0秒即可
     DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
     LocalDate startDate = LocalDate.parse(startDateStr, dateFormatter);
     LocalDate endDate = LocalDate.parse(endDateStr, dateFormatter);
     // Add one day to the end date
     LocalDate endDatePlusOneDay = endDate.plusDays(1);
    
     // 可以封装成一个方法,专门处理日期范围的参数
     /**
      * 将传入的object类型的日期加day天后返回.
      * @param obj
      * @param day
      * @return
      */
     public static String AddDateDays(Object obj, int day) {
     	DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
     	LocalDate endDate = LocalDate.parse(obj.toString(), dateFormatter);
     	// Add one day to the end date
     	LocalDate endDatePlusOneDay = endDate.plusDays(day);
     	return endDatePlusOneDay.toString();
     }
    
     /**
      * 将传入的object类型的日期加1天后返回
      * @param obj
      * @return
      */
     public static String AddDateDays(Object obj) {
     	return AddDateDays(obj, 1);
     }
    
  3. 优化建议: 如果你不得不在数据库查询中使用 DATE_FORMAT 函数,可以考虑以下几点来优化性能:

    • 使用索引字段进行筛选,然后在应用程序层进行进一步的日期格式化。
    • 将频繁使用的格式化结果缓存在应用程序中,避免频繁调用 DATE_FORMAT 函数。
  4. 考虑数据库设计: 如果日期的格式化需求比较频繁且重要,可以考虑在数据库设计阶段将格式化后的日期作为一个额外的字段存储。这样可以避免在查询时频繁使用 DATE_FORMAT 函数。

综上所述,虽然 DATE_FORMAT 函数在某些情况下很方便,但需要谨慎使用以避免性能问题。在可能的情况下,尽量将日期格式化操作移到应用程序层进行,从而减轻数据库的计算负担。文章来源地址https://www.toymoban.com/news/detail-681160.html

需要注意的

  • mysql中的create_time和update_time一般是保留了时间部分的,是个日期时间字段,如下
    mysql~date_format性能问题
  • mybatis的xml中,我们实现在比较时,是以字符串的形式进行的,使用带着时间的日期字段与传入的参数(只有日期部分),进行字符比较,这要求我们传入参数时,它应该是个字符串,而不是LocalDate类型。
  <if test="params.begincreateTime != null and params.begincreateTime != ''"><!-- 开始时间检索 -->
      AND create_time &gt;= #{params.begincreateTime}
  </if>
  <if test="params.beginendTime != null and params.beginendTime != ''"><!-- 结束时间检索 -->
      AND create_time &lt;= #{params.beginendTime}
  </if>
  • 上面代码中params.beginendTime是一个字符串

到了这里,关于mysql~date_format性能问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL中使用DATE_FORMATE格式转换需要注意的问题

    【参考格式】 %Y:4位的年份 %y:2位的年份 %m:2位的月份 %d:2位的日期 %H:24小时制的小时 %h:12小时制的小时 %i:2位的分钟 %s:2位的秒钟 %W:星期的全名 %w:星期的缩写 %M:月份的全名 %b:月份的缩写 参考链接

    2024年02月07日
    浏览(42)
  • Mysql同步到ES时date和time字段类型转换问题解决办法

    这个问题中发生问题的es字段映射类型为date类型!!! 字符串类型的会好很多,关键我这边是通过logstash生成索引,并且全量同步的,不好改索引类型!!! 问题描述: 根据错误日志,似乎是Elasticsearch无法解析日期字段 START_TIME 。这个字段的格式是 YYYY-MM-DD HH:MM:SS ,而Ela

    2024年02月16日
    浏览(46)
  • element-ui el-date-picker日期选择器 value-format问题

    通过原生js和moment.js分别获取 moment().format(\\\'YYYY-MM-DD HH:mm:ss\\\') 格式的时间 moment.js:文档 | Moment.js 中文网 (momentjs.cn)

    2024年02月12日
    浏览(50)
  • mybatis&Mysql分页查询,以及SQL_CALC_FOUND_ROWS与count(*) 性能对比

    温故而知新,这里记录一下         分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。         相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般

    2024年01月23日
    浏览(57)
  • MySQL同时In俩个字段,In多个字段,Mybatis多个In查询问题,Mysql多个IN查询多出数据问题,Mysql多个IN查询 数据准确问题

            今天产品验收的时候,导入了大量数据;发现造价项目某个查询列表数据多出了几条数据;看了Mybatis查询,才发现是同时使用了多个IN查询导致的问题;入参是对象列表,In值是分开循环赋值的,问题就出在这里。         需要根据两个字段去查询多个值,这

    2024年02月13日
    浏览(38)
  • 【业务功能篇133】 Mysql连接串优化性能问题

     rewriteBatchedStatements=true开启了MySQL驱动程序的批量处理功能。 spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?rewriteBatchedStatements=true 在MyBatis Plus框架中,批量插入是一种高效的数据库操作方式。通过开启 rewriteBatchedStatements=true ,可以获得许多优点,从而提高数据库插入性能、

    2024年01月25日
    浏览(40)
  • MYSQL单表数据量达到多少时性能会严重下降的问题探讨!

    不知从什么时候开始,有着MySQL单表数据量超过2000万性能急剧下降的说法。 在中国互联网技术圈流传着这么一个说法:MySQL 单表数据量大于 2000 万行,性能会明显下降。事实上,这个传闻据说最早起源于百度。具体情况大概是这样的,当年的 DBA 测试 MySQL性能时发现,当单表

    2024年02月09日
    浏览(40)
  • MySQL性能分析工具的使用

    当我们遇到数据库调优问题的时候,该如何思考呢?这里把思考的流程整理成下面这张图。 整个流程划分成了 观察( Show status ) 和 行动( Action ) 两个部分。字母 S 的部分代表观察(会使用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)。    

    2024年02月09日
    浏览(61)
  • Simple Date Format类到底为啥不是线程安全的?

    摘要: 我们就一起看下在高并发下Simple Date Format类为何会出现安全问题,以及如何解决Simple Date Format类的安全问题。 本文分享自华为云社区《【高并发】SimpleDateFormat类到底为啥不是线程安全的?》,作者:冰 河。 首先问下大家:你使用的Simple Date Format类还安全吗?为什么

    2024年02月07日
    浏览(42)
  • MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql

      目录 打印MyBatis的日志配置: 灰度发布:指发布环境,比如发布环境有200台机器,发布的时候是一批一批的机器的发布 2.删除与修改 使用@Results注解,这样就和上面的别名一个意思,column是数据库的列 自动转驼峰(优雅,最推荐使用) 学习XML的方式 MyBatis:用于去简化数据库

    2024年01月17日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包