SQL如何插入百万条数据,及加索引和无索引的速度区别

  • Post author:
  • Post category:其他



1、首先创建表

CREATE TABLE `app_user`(
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '' COMMENT '用户昵称',
`email` VARCHAR(50) NOT NULL COMMENT '用户邮箱',
`phone` VARCHAR(20) DEFAULT '' COMMENT '手机号',
`gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别: 0:男,1:女',
`password` VARCHAR(100) NOT NULL COMMENT '密码',
`age` TINYINT(4) DEFAULT '0' COMMENT '年龄',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'


2、其次创建一个函数以循环插入百万条数据

DELIMITER $$
CREATE FUNCTION mock_date()
RETURNS INT
BEGIN
   DECLARE num INT DEFAULT 1000000;
   DECLARE i INT DEFAULT 0;
   WHILE i<num DO
   INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`) VALUES(CONCAT('用户',i),
	'1254452663@qq.com',
	CONCAT(16,FLOOR(RAND()*((999999999-1000000000)+1000000000))),
	FLOOR(RAND()*2),
	UUID(),
	FLOOR(RAND()*100));
   SET i = i+1;
   END WHILE;
   RETURN i;
END;


3、添加索引前运行

EXPLAIN SELECT * FROM app_user WHERE `name` = ‘用户900440’;


查看sql运行状态

运行

SELECT * FROM app_user WHERE `name` = ‘用户9999’;

发现总耗时0.527s


4、添加索引

CREATE INDEX id_app_user_name ON app_user(`name`);


5、再次运行

EXPLAIN SELECT * FROM app_user WHERE `name` = ‘用户900440’;


查看sql运行状态

运行

SELECT * FROM app_user WHERE `name` = ‘用户100000’;

发现总耗时0.001s


总结:索引在小数据量时效果不大,但在大数据时效果非常明显


但是!!!


  • 索引不是越多越好

  • 不要对进程变动数据加索引

  • 小数据量的表不需要加索引

  • 索引一般加在常用来查询的字段上



版权声明:本文为Hazozzz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。