有无索引的性能比较:mysql插入100万条数据后查询

Posted amcomputer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有无索引的性能比较:mysql插入100万条数据后查询相关的知识,希望对你有一定的参考价值。

1 环境

win 7 +mysql8.0 +nvicat
内存12个G

2 建表

CREATE TABLEIF NOT EXISTS `app_user`(
id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
email varchar(50) NOT NULL,
phone varchar(20) NOT NULL,
gender tinyint(4) unsigned DEFAULT 0,
password  varchar(100) NOT NULL,
age tinyint(2)  NOT NULL,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

3 尝试插入1条

INSERT INTO app_user(name, email, phone,password)
VALUES(CONCAT('用户1'),'18888888@qq.com','1234567', FLOOR(RAND()*100));

4 写函数

/*
  第一个语句 delimiter 将 mysql 解释器命令行的结束符由”;” 改成了”$$”,
  让存储过程内的命令遇到”;” 不执行
*/
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
DETERMINISTIC

BEGIN
	DECLARE num INT DEFAULT 1000000;
	DECLARE i INT DEFAULT 0;
	WHILE i<num DO
		INSERT INTO `app_user`(`name`,`email`,`phone`,`gender`,`password`)VALUES(CONCAT('用户',i),'19224305@qq.com','123456789',FLOOR(RAND()*2), FLOOR(RAND()*100));
		SET i=i+1;
	END WHILE;
	RETURN i;
END;$$

注意,5.0版本不需要DETERMINISTIC,8.0需要加这行命令。

5 执行函数


SELECT mock_data()$$ -- 执行此函数 生成一百万条数据


生成数据花了168秒,恐怖!!

查看下数据:

6 性能分析

用主键查数据:

 SELECT * FROM app_user WHERE id = 99990;
 


用非主键查数据:

 SELECT * FROM app_user WHERE name = '用户9999';


区别还是很明显的。在用户体验上,体现出有无索引的好处。

进一步分析:

使用,explain命令,查询了994825行才查到。

7 创建索引

之前查询太慢了,试试给nam字段添加索引

  -- id __表名字_字段名
	
	CREATE INDEX id_app_user_name on app_user(name)


只查询了一行,速度变快了。原因是重新建了一颗索引树,空间换时间。

查询时间:


这就是建立索引的好处。

以上是关于有无索引的性能比较:mysql插入100万条数据后查询的主要内容,如果未能解决你的问题,请参考以下文章

c#中往mysql里批量插入上万条数据,有比较高效的方法吗

oracle 插入100万条数据,更新100万条数据

MySQL常用存储引擎比较

MySQL常用存储引擎比较

再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化

批量向MySQL导入1000万条数据的优化