1#存储过程插入10000条数据
建立存储过程
DELIMITER $$
USE `oa`$$
DROP PROCEDURE IF EXISTS `init_data`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `init_data`()
BEGIN
DECLARE dindex INT DEFAULT 1;
WHILE dindex <=10000 DO
INSERT INTO student(sno,sname) VALUES (CONCAT('s',dindex),CONCAT('测试姓名',dindex));
SET dindex=dindex+1;
END WHILE;
END$$
DELIMITER ;
查询:call init_data()
共 1 行受到影响
执行耗时 : 4 min 2 sec
传送时间 : 0.004 sec
总耗时 : 4 min 2 sec
方法2通过jdbc插入10000条数据
<insert id="batchInsert">
insert into student
(
sno,
sname
) values
<foreach collection="list" item="item" index="index"
separator=",">
(
#{item.sno},
#{item.sname}
)
</foreach>
</insert>
耗时:0.828秒
假如提升到10万条数据,时间大概是
耗时:3.747秒
方法1,2对比一下建议我们尽量少在存储过程调用循环大数据量插入这种方式。而且使用这种方式插入大数据量效率还是可以的。
我们试试来查询表中某重复字段数据,测试数据量分别20w和30w
SELECT t.id,t.sname FROM student
t GROUP BY t.sname
HAVING COUNT(t.sname
)>1
20w数据时
执行耗时 : 2.475 sec
传送时间 : 0.004 sec
总耗时 : 2.479 sec
30w数据时
执行耗时 : 3.565 sec
传送时间 : 0.004 sec
总耗时 : 3.570 sec
20w到30w的数据还是有些差别,而且这还是没建任何索引的情况下得出来的,显然到百万级的时候这查询速度还是十分不乐观的,即便加了索引,效率也不会有质的提升,假如单表数据已经破百万,你也是时候考虑分库分表了。
奉上我的测试环境

image.png
mysql使用的是5.7版本,innodb引擎。