MySQL 查询运行很长时间将日期时间转换为日期

标签 mysql sql

我有一个相当优化的查询。但是,当我添加此联接时,查询时间增加了 70 秒。我看到的最大问题是我必须根据同一日期相互比较两个日期时间。换句话说,2013-01-01 8:37am 必须加入到 2013-01-01 9:01am。因此,我首先将两者都转换为日期,然后比较它们。

有没有一种更快的方法可以在不修改表格的情况下完成此操作?我已向下面联接中的所有字段添加了索引。

LEFT JOIN ins ON 
DATE(ins.ins_date) = DATE(r.date) 

更新:最终尝试了一些不同的技巧,例如从日期中减去几个小时并直接比较日期将利用至少一个索引,并且向联接添加更多条件有助于减少它尝试的记录执行 DATE() 操作。我相信下面的海报也提出了为日期创建单独字段的有效建议,但我无法修改这种情况下的表格,但我将来可能会尝试这样做。

最佳答案

在您向我们展示的连接语句中,您正在将日期时间转换为普通日期以便进行比较。这意味着数据库引擎必须检查表中的每个 *单个* 记录,看看它们是否满足您所追求的条件。即使您在 ins_date 上有索引,引擎也无法使用它来查找您要查找的记录。

看看是否可以重新设计查询以使用其 native 形式的列(即不对其应用任何转换)。如果您必须对列应用某种转换才能执行联接或过滤,请尝试仅对该联接中的最小表执行此操作,以减少必须检索和转换的记录数。

如果可以的话,并且这是一个不仅仅是偶尔运行的查询,请查看是否可以将正在使用的列重新定义为 DATE 而不是 DATETIME 类型。如果您的应用程序中需要 DATETIME 值的时间部分,那么看看是否可以维护一个仅包含该 DateTime 值的 DATE 部分的幽灵 DATE 列(这可以通过插入查询或触发器来维护) )。

关于MySQL 查询运行很长时间将日期时间转换为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17904996/

相关文章:

mysql - 创建、填充和使用 Docker 卷

php - 如何将动态添加的表单字段发布到mysql数据库

php - 在 PHP 中循环插入查询

mysql - 如果 ID 在另一个表中不匹配,则返回 NULL

SQL编译

mysql - 不同数据库厂商如何存储数据库的元数据

python - 使用 SQLMap 中的凭据直接连接到数据库

mysql - 如何将 to_timestamp ('12-10-18 12:00:16.565736000 PM' ,'DD-MM-RR HH12:MI:SSXFF AM' ) 转换为 MySQL

sql - SQL批量插入父子表的操作

MySQL 通过键选择行或回退到默认键选择