##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 就不会出问题,刚开始没有问题,读了一会时候你会发现越来越慢,出现了limit 深度分页问题
//start和end 是个变量
select * from User limit start,end;
较好的写法如下,充分利用id的索引~
SELECT
*
FROM User
WHERE
id>#{maxId} order by `id` asc
LIMIT #{limit}