很多時候需要用到連續的id進行數據對比,如判斷是否連續等問題。那么,生成連續整數的方式有多種,首先容易想到的是逐步循環,如果想生成1kw條記錄,則需要循環1kw次進行插入,那么有沒有其他方式呢,效率相對于逐步加一有多少提升呢。帶此疑問,我們進行一番測試。
提前創建一張存放記錄的表。
CREATE TABLE nums(id INT);
1、使用逐步+1遞增的循環方式
DELIMITER $$
CREATE PROCEDURE sp_createNum1 (cnt INT)
BEGIN
DECLARE i INT DEFAULT 1 ;
TRUNCATE TABLE nums ;WHILE i <= cnt DO
BEGIN
INSERT INTO nums SELECT i;
SET i = i+1 ;
END ;
END WHILE ;
END $$
DELIMITER ;
生成20W數據用時達到14min,不是一般的慢。
2、 二的N次方法插入
此方法借鑒于姜老師的書上,不過對此進行了改造,解決輸入值與最終獲得的記錄不一致的情況。
DELIMITER $$
CREATE PROCEDURE `sp_createNum`(cnt INT )
BEGIN
DECLARE i INT DEFAULT 1;
TRUNCATE TABLE nums;
INSERT INTO nums SELECT i;
WHILE i < cnt DO
BEGIN
INSERT INTO nums SELECT id + i FROM nums WHERE id + i<=cnt;
SET i = i*2;
END;
END WHILE;
END$$
DELIMITER ;
相同的數據庫下,本次只需要0.05s,感興趣的小伙伴可以親自測一下。
Tips:
性能提升的原因在于方法1需要執行20W次insert,而方法2是按照2的指數級插入,20W數據只需要不到20次的插入即可完成。