2016-09-28 40 views

回答

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

您为支持NDB而支付的第一个价格是由第二个子查询创建的内部有序临时表,它与您的表一样大,在使用此查询时请记住这一点。

第二个支付的价格是创建这个临时排序表所需的时间。在我对100K行表进行的测试中,查询花费了大约1.5到2秒的时间查询,而大约100毫秒没有它。

该解决方案是基于在this blog

希望这有助于找到更广泛的一个。