1. 程式人生 > >MySQL使用儲存過程插入千萬級資料如何提升效率?

MySQL使用儲存過程插入千萬級資料如何提升效率?

-- MySQL測試任務:使用儲存過程,往表中插入千萬級資料,根據索引優化速度 -- 1.使用索引查詢 -- 2.不使用索引查 -- 3.比較兩者查詢速度的差異 -- 1.建立索引測試表 DROP TABLE IF EXISTS index_test; CREATE TABLE index_test( id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT, USER VARCHAR(16) DEFAULT NULL, psd varchar(64) default null /*psd mediumint DEFAULT 0 儲存隨機資料*/ )ENGINE=MyISAM DEFAULT CHARSET=utf8; /*MYISAM儲存引擎不產生引擎事務,資料插入速度極快,為方便快速插入千萬條測試資料,等我們插完資料,再把儲存型別修改為InnoDB*/
-- 2.建立儲存過程,插入資料 DELIMITER $$ USE `xscj`$$ DROP PROCEDURE IF EXISTS `insert_data`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_data`(IN num INT) BEGIN DECLARE n INT DEFAULT 1;/*定義一個變數,儲存當前執行的次數*/ WHILE n <= num DO   INSERT INTO index_test(USER,psd) VALUES(concat('使用者',n),password(n));/*concat()字串連線、PASSWORD()加密函式*/   /*INSERT INTO index_test(USER,psd) VALUES(CONCAT('使用者',n),ret_pwd());*/ set n=n+1; end while; END$$ DELIMITER ; -- 3.建立一個函式,隨機生成密碼,並返回給pwd欄位 DELIMITER $$ CREATE     /*[DEFINER = { user | CURRENT_USER }]*/     FUNCTION `xscj`.`ret_pwd`()     RETURNS int(5)     /*LANGUAGE SQL     | [NOT] DETERMINISTIC     | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }     | SQL SECURITY { DEFINER | INVOKER }     | COMMENT 'string'*/     BEGIN DECLARE r int default 0; SET r = floor(10+rand()*1000); RETURN r;     END$$ DELIMITER ; -- 4.呼叫儲存過程,插入100萬條資料(總耗時:6 min 35 sec) CALL insert_data(10000000);

-- 5.此步驟可以忽略。修改引擎(執行耗時:2 min 49 sec   傳送時間:1.078 sec   總耗時:2 min 51 sec) ALTER TABLE `index_test` ENGINE=INNODB; -- 6.通過主鍵索引查詢,不使用普通索引(總耗時:0.022 sec) SELECT * FROM index_test WHERE id='1950000';
-- 7.不通過索引查詢(總耗時:7.058 sec) SELECT * FROM index_test WHERE USER='使用者1950000' -- 8.為USER欄位建立普通索引,並通過該索引進行查詢 CREATE INDEX index_user ON index_test (USER ASC);-- (總耗時:1 min 20 sec) SELECT * FROM index_test WHERE USER='使用者1950000';-- (總耗時:0.078 sec) -- 9.使用user、pwd聯合查詢,由於user添加了索引,pwd未新增索引,故進行篩選查詢是仍舊採用全表掃描,因此時間略有提升(總耗時:7.086 sec) SELECT * FROM index_test WHERE USER='使用者1950000' OR psd='*B810355CF0690506E5295AA66741D44E6AF4E61D'; -- 10.對user、pwd欄位建立聚合索引後,再查詢 CREATE INDEX index_userpwd ON index_test (USER,psd ASC);-- (總耗時:2 min 25 sec) SELECT * FROM index_test WHERE USER='使用者1950000' OR psd='*B810355CF0690506E5295AA66741D44E6AF4E61D';-- (總耗時:13.014 sec) -- 查看錶結構 DESC index_test; -- 查詢表資料 SELECT * FROM index_test; -- 刪除表資料 DELETE FROM index_test; -- 刪除索引 DROP INDEX index_user ON `index_test`; DROP INDEX index_userpwd ON `index_test`;