签到成功

知道了

CNDBA社区CNDBA社区

MySQL使用存储过程插入千万级数据如何提升效率

2021-10-02 09:18 1015 0 原创 mysql
作者: hbhe0316

— 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/http://www.cndba.cn/hbhe0316/article/4834

— 2.创建存储过程,插入数据http://www.cndba.cn/hbhe0316/article/4834http://www.cndba.cn/hbhe0316/article/4834

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字段http://www.cndba.cn/hbhe0316/article/4834

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)

http://www.cndba.cn/hbhe0316/article/4834
http://www.cndba.cn/hbhe0316/article/4834

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字段创建普通索引,并通过该索引进行查询http://www.cndba.cn/hbhe0316/article/4834http://www.cndba.cn/hbhe0316/article/4834

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)

— 查看表结构http://www.cndba.cn/hbhe0316/article/4834

DESC index_test;

— 查询表数据

SELECT * FROM index_test;

— 删除表数据

DELETE FROM index_test;

— 删除索引http://www.cndba.cn/hbhe0316/article/4834

DROP INDEX index_user ON `index_test`;
DROP INDEX index_userpwd ON `index_test`;

版权声明:本文为博主原创文章,未经博主允许不得转载。

Mysql

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
hbhe0316

hbhe0316

关注

1.只有承认无知,才能装下新的东西; 2.进步来自一点点滴滴的积累; 3.广博让你更优秀,而专业让你无法替代; 4.挫折和失败能够转换为一种财富。

  • 889
    原创
  • 1
    翻译
  • 13
    转载
  • 24
    评论
  • 访问:1039428次
  • 积分:1523
  • 等级:核心会员
  • 排名:第6名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ