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的數據還是有些差別,而且這還是沒建任何索引的情況下得出來的,顯然到百萬級的時候這查詢速度還是十分不樂觀的,即便加了索引,效率也不會有質的提升,假如單表數據已經破百萬,你也是時候考慮分庫分表了。
奉上我的測試環境
mysql使用的是5.7版本,innodb引擎。