mysql - 在 MariaDB 中,相同记录集上的相同 UPDATE SQL 似乎行为不当

标签 mysql sql mariadb

问题:MariaDB 的逻辑似乎行为不当。

目标:创建自引用 ID 列值以引用前一条记录。

描述:我们有一个非常大的记录表,以 ID 作为主键和记录时间,分布在终端之间。我们想要创建一个列来保存同一终端的当前记录的前一条记录的 ID 值,具体取决于记录的时间,我们将使用该列进行自连接以通过以下方式选择当前记录的前一条记录为了提高查询性能,而不是在每次查询期间动态选择以前的记录。

期望:了解实际发生的情况以及跨数据库引擎(至少 MySQL 和 MariaDB)兼容的具有最佳性能的 UPDATE 查询。

UPDATE tst_terminaldata SET PreviousID = NULL;

UPDATE tst_terminaldata AS TD
SET TD.PreviousID =
    (SELECT TDP.ID FROM
        (SELECT TDP2.ID, TDP2.Time, TDP2.TerminalID
                         FROM tst_terminaldata AS TDP2
                         ORDER BY 
  TDP2.Time DESC, TDP2.ID DESC /* Works for- Windows: MySQL 8.0.16, 5.7.11; Linux: MySQL 8.0.13, 8.0, 5.7.20 */
  TDP2.Time ASC, TDP2.ID ASC /* Works for- Windows: MariaDB 10.4.7; Linux: MariaDB 10.2.25, 10.1.40 */
        ) AS TDP
        WHERE TDP.TerminalID = TD.TerminalID
          AND TDP.Time < TD.Time
        LIMIT 1
    ) 
WHERE TD.PreviousID IS NULL;

SELECT TD.* FROM tst_terminaldata AS TD
      ORDER BY TD.TerminalID ASC, TD.Time DESC, TD.ID DESC;

案例:MySQL SQL 对我来说似乎合乎逻辑,而不是 MariaDB SQL。但两者都适用于各自的情况(如 SQL 中的注释),这不应该是这样。

示例数据:

ID  TerminalID  Time    PreviousID
1   1   2019-07-29 13:56:37 NULL
2   1   2019-07-29 13:56:52 NULL
3   2   2019-07-29 13:57:01 NULL
4   1   2019-07-29 13:57:02 NULL
5   2   2019-07-29 13:57:08 NULL
6   1   2019-07-29 13:57:17 NULL
7   2   2019-07-29 13:57:23 NULL
8   1   2019-07-29 13:57:32 NULL

最佳答案

    MySQL 和 MariaDB 都会忽略派生表中的 ORDER BY(至少在您尝试的版本中)。
  • 优化器可以自由地以任何顺序显示行。
  • MySQL 和 MariaDB 的优化器代码在此区域的差异约为 5.6/10.0。

这应该可以解释为什么您似乎根据ORDER BY和版本获得不同的结果。

如果您每秒插入 1700 行,我希望您对它们进行批处理并使用 SSD。

我不知道查询的目标是什么,但我建议在数据到达时对其进行消化,而不是与“滞后”类型查询作斗争。

关于mysql - 在 MariaDB 中,相同记录集上的相同 UPDATE SQL 似乎行为不当,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305200/

相关文章:

c# - SQL查询在转换日期后更改列名

sql - Firebase 与 Laravel 的 Google Cloud SQL

MySql:限制一张表中某一列的更新权限

Mysql left join with or condition for fallback 语言

mysql - 获取 100 行,每组最多 10 行

php - 让一个按钮执行一条SQL语句

mysql - 在 SQL 查询上使用 COALSCE 和 3 个 JOINS

MySQL - 更新列中的值与前一行相同的行

mysql - 在 MySQL/MAriaDB 中强制释放用户级锁

mysql - MariaDB 服务器版本错误的原因是什么,以便在附近使用正确的语法