今天实践一下mysql数据库在大数据量的情况下如何优化,这里记录一下过程。
首先是生成百万级别的数据,直接上sql语句
//建表
CREATE TABLE `person` (
`id` bigint(20) unsigned NOT NULL,
`username` varchar(100) NOT NULL,
`age` tinyint(3) unsigned NOT NULL,
`sex` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
//创建生成数据procedure,num代表生成数据量的大小
CREATE PROCEDURE `generate`(IN num INT)
BEGIN
DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE username VARCHAR(25) DEFAULT '';
DECLARE id int UNSIGNED;
DECLARE len int;
set id=1;
DELETE from person;
WHILE id <= num DO
set len = FLOOR(1 + RAND()*25);
set username = '';
WHILE len > 0 DO
SET username = CONCAT(username,substring(char_str,FLOOR(1 + RAND()*62),1));
SET len = len - 1;
END WHILE;
INSERT into person VALUES (id,username, FLOOR(RAND()*100), FLOOR(RAND()*2));
set id = id + 1;
END WHILE;
END
//最后执行generate,生成100万数据
CALL generate(1000000);
接下来就看看查询耗费时间:
//查询第100万条数据
select * from person where username=`select`;
//查询第1条数据
select * from person where username=`65YsbqoyqkbNhQb`;
//查询第50万条数据
select * from person where username=`cFzIG8`;
大概耗费0.16秒,如果是按照主键查询呢?
//按照主键查询,mysql默认会为主键生成索引
//查询第100万条数据
select * from person where id=1000000;
//查询第1条数据
select * from person where id=1;
//查询第50万条数据
select * from person where id=500000;
耗费时间基本很少
那么为username创建索引看看效果
create index index_user on person(username(100));
可以看到,查询时间和按主键进行查询差不多。说明索引对查询效果显著,但是相应的表的体积变大了,未创建索引之前表大概41.7M,创建完后表有59.8M。
下面看看插入的影响有多大。
可以看到有索引的插入语句耗时0.02秒,没有的基本忽略。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。