天天看點

單表過百萬級别同步資料sql寫法

0 概述

實際工作中我們很可能要将某張表資料全部導入到其它表中,當單表資料過大(超過百萬)如果使用sql不當會掃描資料時候比較慢甚至造成故障。

1 執行個體分析

簡單的表結構如下(500w資料)

CREATE TABLE `User` (
  `id` bigint() unsigned NOT NULL AUTO_INCREMENT,
  `userId` bigint() unsigned NOT NULL COMMENT ‘使用者id’,
  `userName`  varchar() NOT NULL DEFAULT '' COMMENT ‘使用者名’,
  `userType` tinyint() unsigned NOT NULL DEFAULT '' COMMENT '使用者類型',
  `created` int() unsigned NOT NULL COMMENT ‘建立時間',
  `updated` int() unsigned NOT NULL COMMENT '更新時間',
  `isDeleted` tinyint() unsigned NOT NULL DEFAULT '' COMMENT '删除',
  PRIMARY KEY (`id`),
  KEY `idx_userId` (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 COMMENT=‘使用者表’;
           

通過JDBC 連接配接mysql,有的人直接寫這樣的sql 語句去掃描全表,這樣是很危險的,很容易會将資料庫搞挂掉~

有的人說使用limit 就不會出問題~剛開始沒有問題,讀了一會時候你會發現越來越慢,因為全表掃描沒有~

//start和end 是個變量
select * from User  limit start,end;
           

較好的寫法如下,充分利用id的索引~

SELECT
         *
        FROM User
        WHERE
        id>#{maxId}  order by `id` asc
        LIMIT #{limit}