问题: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 都会忽略派生表中的
- 优化器可以自由地以任何顺序显示行。
- MySQL 和 MariaDB 的优化器代码在此区域的差异约为 5.6/10.0。
ORDER BY
(至少在您尝试的版本中)。
这应该可以解释为什么您似乎根据ORDER BY
和版本获得不同的结果。
如果您每秒插入 1700 行,我希望您对它们进行批处理并使用 SSD。
我不知道查询的目标是什么,但我建议在数据到达时对其进行消化,而不是与“滞后”类型查询作斗争。
关于mysql - 在 MariaDB 中,相同记录集上的相同 UPDATE SQL 似乎行为不当,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305200/