内存引擎表给出不一致的结果



使用MariaDB 10.6.7-MariaDB-2ubuntu1.1-log - Ubuntu 22.04

我有一个相对复杂的应用程序,它正在使用临时内存(引擎)表。表是从select insert语句生成的,然后对数据进行操作。在此之后,执行一系列选择,并对同一表进行一次或多次重新连接。

用table create语句创建了8个索引,有些是hash,有些是btree。

使用完全相同的数据执行完全相同的过程,我得到的结果略有不同(在数据返回和行数方面)。

我花了一段时间才找到这个问题的根源,我发现临时内存表在数据方面是相同的,数据库调用是相同的。

我让表被创建为永久内存表,这样我就可以在myphpadmin中看到它们,重命名它们,并让它们再次被创建。然后对每个表运行相同的查询,得到不同的结果。表校验和是相同的,行数是相同的。但是,当表作为内存引擎时,相同的查询给出不同的结果。将它们都转换为INNODB,两者都给出相同的结果…内存引擎坏了吗?

有没有人见过这种情况,并对可能发生的事情有任何想法?

提前感谢。

我找到了答案,以防有人感兴趣或有同样的问题。

在我的查询中,我有一个订单和限制1

的例子。

SELECT * FROM `tmp_lookup` T2
WHERE
T2.`from_location` = 'location1'
T2.`to_location` = 'location2'
T2.`depart_time` > '1970-01-01 22:14:00'
ORDER BY T2.`depart_time` ASC
LIMIT 1;

在上面的示例中,当按depart_time排序并限制为1时,如果有多个具有相同最小depart_time的行,它将根据表的不同从具有相同值的行中随机返回第一行。

如果你建立一个内存表并执行查询,它将始终选择相同的第一行,删除表,重新创建表,重新运行查询,它将始终选择另一个第一行。

我不知道为什么,但我猜,因为它在内存中,而不是在磁盘上,表中的行顺序是"随机的"完全猜测。

最新更新