在mysql中,命令CHECKSUM TABLE table1name
适用于InnoDB& MyISAM但不适用于ndbcluster
。是否有其他方法可以找到校验和或某些相关属性,以便在进行任何交互后知道表格是否相同。
答案 0 :(得分:1)
如果我正确理解了这个问题,你就会问如何在基于NDB引擎的情况下获取mysql表的校验和。 以下查询将解决这个问题:
SELECT @crc as crc FROM
(
select @crc := ''
) tmp,
(
SELECT min(
length(
@crc := sha1(
concat(
@crc, sha1(
concat_ws('#', field_1, field_2, ...)
)
)
)
)
)
)
FROM
(
SELECT field_1, field_2, ... FROM your_table
ORDER BY yourtable_some_key_id
) tmp_1
) final
在InnoDB下,这不需要第二个子查询并且可以工作,但接着是本机 CHECKSUM TABLE your_table 也会有用。尽管您可以在ORDER BY子句中指定任何排序,但内部处理在排序结果之前进行,而在NDB上,此顺序并不总是相同。在这种情况下,我们需要强制它,因此第二个子查询具有特定的排序顺序。
为使NDB工作而付出的第一个价格是由第二个子查询创建的内部有序临时表,该表与您的表一样大,这是使用此查询时要记住的一件事。
支付的第二个价格是创建此临时有序表所需的时间。在我对具有100K行的表的测试中,查询花了大约1.5到2秒的子查询,大约100毫秒没有它。
此解决方案基于this blog
中更常见的解决方案希望这有帮助。