mysql性能檢測01

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


18094074-08e2814d4a867410.png
image.png

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章