單表過百萬級別同步資料sql寫法
阿新 • • 發佈:2018-12-31
0 概述
實際工作中我們很可能要將某張表資料全部匯入到其它表中,當單表資料過大(超過百萬)如果使用sql不當會掃描資料時候比較慢甚至造成故障。
1 例項分析
簡單的表結構如下(500w資料)
CREATE TABLE `User` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`userId` bigint(20) unsigned NOT NULL COMMENT ‘使用者id’,
`userName` varchar(50) NOT NULL DEFAULT '' COMMENT ‘使用者名稱’,
`userType` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '使用者型別',
`created` int(11) unsigned NOT NULL COMMENT ‘建立時間',
`updated` int(11) unsigned NOT NULL COMMENT '更新時間',
`isDeleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '刪除',
PRIMARY KEY (`id`),
KEY `idx_userId` (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=954 DEFAULT CHARSET=utf8 COMMENT=‘使用者表’;
通過JDBC 連線mysql,有的人直接寫這樣的sql 語句去掃描全表,這樣是很危險的,很容易會將資料庫搞掛掉~
select * from User;
有的人說使用limit 就不會出問題~剛開始沒有問題,讀了一會時候你會發現越來越慢,因為全表掃描沒有~
//start和end 是個變數
select * from User limit start,end;
較好的寫法如下,充分利用id的索引~
SELECT
*
FROM User
WHERE
id>#{maxId} order by `id` asc
LIMIT #{limit}