Mysql CHECKSUM TABLE 不适用于 ndbcluster

Mysql CHECKSUM TABLE not working for ndbcluster

在 mysql 中,命令 CHECKSUM TABLE table1name 适用于 InnoDB 和 MyISAM 但不适用于 ndbcluster。是否有任何其他方法可以找到校验和或相关属性,以便了解 table 在对其进行任何交互后是否相同。

如果我理解正确的话,你问的是如何在基于 NDB 引擎时获取 mysql table 的校验和。 以下查询可以解决问题:

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 下,这不需要第二个子查询并且可以工作,但是本机 校验和 TABLE your_table 也会工作。尽管您可以在 ORDER BY 子句中指定任何顺序,但内部处理发生在结果排序之前,并且在 NDB 上,此顺序并不总是相同。在这种情况下,我们需要强制执行它,因此具有特定排序顺序的第二个子查询。

你为让它在 NDB 上运行而付出的第一个代价是第二个子查询创建的内部有序临时 table,它与你的 table 一样大,这是一个使用此查询时要记住的事情。

第二个支付的价格是创建这个临时订单所花费的时间table。在我对具有 100K 行的 table 的测试中,使用子查询的查询大约需要 1.5 到 2 秒,没有它大约需要 100 毫秒。

此解决方案基于 this blog

中的一个更通用的解决方案

希望对您有所帮助。