基于 information_schema for MySQL 的动态行哈希

Dynamic row hash based on information_schema for MySQL

我们每天处理大量数据,减少处理时间的一种方法是跳过前一天没有更改的任何记录。我们通过计算我们想要检测变化的所有列的 MD5 哈希值并将其与昨天的行哈希值进行比较来做到这一点。问题是每次我们添加一列到负载时,我们需要记住将它添加到行哈希计算中。这并不总是发生并且是不必要的重复工作。为了使其自动化,我想使用信息模式来动态构建我的列列表。我花了比我愿意承认的时间更长的时间来寻找答案并最终建立自己的答案。希望这对其他人有帮助。

我们需要使用动态 sql 设置变量,因此需要使用过程来完成。从 WHERE 子句中替换 table 名称和排除的列,您应该可以开始了。此版本在我们正​​在为其计算行哈希的 table 中更新了一个名为“rowHash”的列,但可以根据其他需要进行修改。

DROP PROCEDURE IF EXISTS sp_set_dynamic_rowhash;
CREATE PROCEDURE sp_set_dynamic_rowhash()
    SQL SECURITY INVOKER
BEGIN

SET @sql = (SELECT CONCAT('UPDATE TableName SET rowHash = MD5(CONCAT(',GROUP_CONCAT('IFNULL(LTRIM(RTRIM(',column_name,')),"")'), '))')
            FROM information_schema.columns 
            WHERE table_name = 'TableName'
            AND table_schema = 'TableSchema'
            AND column_name NOT IN ('excluded_col_1','excluded_col_2','excluded_col_3', 'Rowhash')
           );
         
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END;