《Mysql入門MySQL InnoDB | 索引、提交頻率對InnoDB表寫入速度的影響》要點:
本文介紹了Mysql入門MySQL InnoDB | 索引、提交頻率對InnoDB表寫入速度的影響,希望對您有用。如果有疑問,可以聯系我們。
1、關于索引對寫入速度的影響:
a、如果有自增列做主鍵,相對完全沒索引的情況,寫入速度約提升 3.11%;
b、如果有自增列做主鍵,并且二級索引,相對完全沒索引的情況,寫入速度約降低 27.37%;
因此,InnoDB表最好總是有一個自增列做主鍵.MYSQL數據庫
?MYSQL數據庫
2、關于提交頻率對寫入速度的影響(以表中只有自增列做主鍵的場景,一次寫入數據30萬行數據為例):MYSQL數據庫
a、等待全部數據寫入完成后,最后再執行commit提交的效率最高;
b、每10萬行提交一次,相對一次性提交,約慢了1.17%;
c、每1萬行提交一次,相對一次性提交,約慢了3.01%;
d、每1千行提交一次,相對一次性提交,約慢了23.38%;
e、每100行提交一次,相對一次性提交,約慢了24.44%;
f、每10行提交一次,相對一次性提交,約慢了92.78%;
g、每行提交一次,相對一次性提交,約慢了546.78%,也就是慢了5倍;
因此,最好是等待所有事務結束后再批量提交,而不是每執行完一個SQL就提交一次.MYSQL數據庫
曾經有一次對比測試mysqldump啟用extended-insert和未啟用導出的SQL腳本,后者比前者慢了不止5倍.MYSQL數據庫
?MYSQL數據庫
下面是詳細的測試案例過程,有興趣的同學可以看看:MYSQL數據庫
DROP TABLE IF EXISTS `mytab`;
CREATE TABLE `mytab` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`c1` int(11) NOT NULL DEFAULT '0',
`c2` int(11) NOT NULL DEFAULT '0',
`c3` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`c4` varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB;MYSQL數據庫
DELIMITER $$$
DROP PROCEDURE IF EXISTS `insert_mytab`;MYSQL數據庫
CREATE PROCEDURE `insert_mytab`(in rownum int, in commitrate int)
BEGIN
DECLARE i INT DEFAULT 0;MYSQL數據庫
SET AUTOCOMMIT = 0;MYSQL數據庫
WHILE i < rownum DO INSERT INTO mytab(c1, c2, c3,c4) VALUES( FLOOR(RAND()*rownum),FLOOR(RAND()*rownum),NOW(), REPEAT(CHAR(ROUND(RAND()*255)),200)); SET i = i+1; /* 達到每 COMMITRATE 頻率時提交一次 */ IF (commitrate > 0) AND (i % commitrate = 0) THEN
COMMIT;
SELECT CONCAT('commitrate: ', commitrate, ' in ', I);
END IF;MYSQL數據庫
END WHILE;MYSQL數據庫
/* 最終再提交一次,確保成功 */
COMMIT;
SELECT 'ALL COMMIT;';MYSQL數據庫
END; $$$MYSQL數據庫
#測試調用
call insert_mytab(300000, 1); -- 每次一提交
call insert_mytab(300000, 10); -- 每10次一提交
call insert_mytab(300000, 100); -- 每100次一提交
call insert_mytab(300000, 1000); -- 每1千次一提交
call insert_mytab(300000, 10000); -- 每1萬次提交
call insert_mytab(300000, 100000); -- 每10萬次一提交
call insert_mytab(300000, 0); -- 一次性提交MYSQL數據庫
?MYSQL數據庫
測試耗時結果對比:MYSQL數據庫
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/5716.html