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}