Mysql CHECKSUM TABLE不适用于ndbcluster

时间:2016-09-28 07:56:26

标签: mysql innodb checksum myisam

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

1 个答案:

答案 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

中更常见的解决方案

希望这有帮助。