主頁(yè) > 知識(shí)庫(kù) > MySQL快速對(duì)比數(shù)據(jù)技巧

MySQL快速對(duì)比數(shù)據(jù)技巧

熱門標(biāo)簽:凱立德科技館地圖標(biāo)注 甘孜電話機(jī)器人廠家 中科嘉智人工智能電銷機(jī)器人 銀川電銷外呼系統(tǒng)定制 哈爾濱crm外呼系統(tǒng)價(jià)格 電銷機(jī)器人好品牌門薩維l 做地圖標(biāo)注都需要什么工具 西安400電話在哪里辦理 上海智能外呼系統(tǒng)需要多少錢

在MySQL運(yùn)維中,研發(fā)同事想對(duì)比下兩個(gè)不同實(shí)例上的數(shù)據(jù)并找出差異,除主鍵外還需要對(duì)比每一個(gè)字段,如何做呢?

第一種方案,寫程序?qū)蓚€(gè)實(shí)例上的每一行數(shù)據(jù)取出來(lái)進(jìn)行對(duì)比,理論可行,但是對(duì)比時(shí)間較長(zhǎng)。

第二種方案,對(duì)每一行數(shù)據(jù)所有字段合并起來(lái),取checksum值,再按照checksum值對(duì)比,看著可行,嘗試下。

首先要合并所有字段的值,選用MySQL提供的CONCAT函數(shù),如果CONCAT函數(shù)中包含NULL值,會(huì)導(dǎo)致最終結(jié)果為NULL,因此需要使用IFNULL函數(shù)來(lái)替換NULL值,如:

CONCAT(IFNULL(C1,''),IFNULL(C2,''))

加入表有很多行,手動(dòng)拼個(gè)腳本比較累,別急,可以使用information_schema.COLUMNS來(lái)處理:

## 獲取列名的拼接串
SELECT
GROUP_CONCAT('IFNULL(',COLUMN_NAME,','''')')
FROM information_schema.COLUMNS 
WHERE TABLE_NAME='table_name';

假設(shè)我們有測(cè)試表:

CREATE TABLE t_test01
(
 id INT AUTO_INCREMENT PRIMARY KEY,
 C1 INT,
 C2 INT
)

我們便可以拼接出下面的SQL:

SELECT
id,
MD5(CONCAT(
IFNULL(id,''),
IFNULL(c1,''),
IFNULL(c2,''),
)) AS md5_value
FROM t_test01

在兩個(gè)實(shí)例上執(zhí)行下,然后把結(jié)果使用beyond compare對(duì)比下,就很容易找出不相同的行以及主鍵ID

對(duì)于數(shù)據(jù)量較大的表,執(zhí)行出來(lái)的結(jié)果集也很大,對(duì)比起來(lái)比較費(fèi)勁,那就先嘗試縮小結(jié)果集,可以將多行記錄的md5值合并起來(lái)求MD5值,如果最后MD5值相同,則這些行相同,如果不同,則證明存在差異,再按照這些行進(jìn)行逐行對(duì)比。

假設(shè)我們按照1000行一組來(lái)進(jìn)行對(duì)比,如果需要將分組后的結(jié)果合并,需要使用GROUP_CONCAT函數(shù),注意在GROUP_CONCAT函數(shù)中添加排序保證合并數(shù)據(jù)的順序, SQL如下:

SELECT
min(id) as min_id,
max(id) as max_id,
count(1) as row_count,
MD5(GROUP_CONCAT(
MD5(CONCAT(
IFNULL(id,''),
IFNULL(c1,''),
IFNULL(c2,''),
)) ORDER BY id
))AS md5_value
FROM t_test01
GROUP BY (id div 1000)

執(zhí)行結(jié)果為:

min_id  max_id  row_count  md5_value
0    999    1000     7d49def23611f610849ef559677fec0c
1000   1999    1000     95d61931aa5d3b48f1e38b3550daee08
2000   2999    1000     b02612548fae8a4455418365b3ae611a
3000   3999    1000     fe798602ab9dd1c69b36a0da568b6dbb 

當(dāng)差異數(shù)據(jù)較少時(shí),即使需要對(duì)比上千萬(wàn)數(shù)據(jù),我們可以輕松根據(jù)根據(jù)min_id和max_id來(lái)快速定位到哪1000條數(shù)據(jù)里存在差異,再進(jìn)行逐行MD5值對(duì)比,最終找到差異行。

最終對(duì)比圖:

PS:

在使用GROUP_CONCAT時(shí),需要配置MySQL變量group_concat_max_len,默認(rèn)值為1024,超出部分會(huì)被階段。

您可能感興趣的文章:
  • mysql 5.7.20常用下載、安裝和配置方法及簡(jiǎn)單操作技巧(解壓版免安裝)
  • JavaWeb連接數(shù)據(jù)庫(kù)MySQL的操作技巧
  • 利用tcpdump對(duì)mysql進(jìn)行抓包操作技巧
  • 30個(gè)mysql千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢優(yōu)化技巧詳解
  • Mysql根據(jù)時(shí)間查詢?nèi)掌诘膬?yōu)化技巧
  • 提升MYSQL查詢效率的10個(gè)SQL語(yǔ)句優(yōu)化技巧
  • MySQL使用的常見問(wèn)題解決與應(yīng)用技巧匯總
  • 5個(gè)保護(hù)MySQL數(shù)據(jù)倉(cāng)庫(kù)的小技巧
  • 分享101個(gè)MySQL調(diào)試與優(yōu)化技巧
  • MySql Sql 優(yōu)化技巧分享
  • MySQL注入繞開過(guò)濾的技巧總結(jié)
  • MySQL數(shù)據(jù)庫(kù)常用操作技巧總結(jié)

標(biāo)簽:安康 山南 那曲 濮陽(yáng) 平頂山 四川 浙江 安徽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL快速對(duì)比數(shù)據(jù)技巧》,本文關(guān)鍵詞  MySQL,快速,對(duì)比,數(shù)據(jù),技巧,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL快速對(duì)比數(shù)據(jù)技巧》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于MySQL快速對(duì)比數(shù)據(jù)技巧的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章