Mysql到底是不是一颗数据库?

gen 发布于 2011/04/27 10:50
阅读 2K+
收藏 4

近来很火的一个帖子,看这里吧http://www.oschina.net/bbs/thread/18961

宏哥说如果MYSQL里有1000万条数据,加一个索引要用8小时,我对此表示怀疑,于是我测试了一下,下面是测试情况:

 

硬件:

处理器: Pentium(R) Dual-Core E5300 @ 2.60GHz 2.60 GHz

可用内存:3GB

操作系统:windows7(32位)

所有的查询操作是在SQLyog客户端下进行的

 

没有主键没有索引

 

插入10万条数据用时4秒。

插入100万条数据用时30秒。

插入1000万条数据用时249秒。

/*[9:51:43][11232 ms]*/ SELECT * FROM userinfo WHERE id=99999  LIMIT 0, 1000;

/*[9:54:29][ 109 ms]*/ SELECT * FROM userinfo WHERE id>99999 AND age!=280 AND NAME='testuser' LIMIT 1 ;

/*[9:55:31][11560 ms]*/ SELECT * FROM userinfo WHERE id=9999999 AND age!=280 AND NAME='testuser' LIMIT 1 ;

 

添加主键

/*[10:01:07][170337 ms]*/ ALTER TABLE `userinfo` ADD PRIMARY KEY ( `id` )  ;

添加索引

/*[10:10:28][283063 ms]*/ ALTER TABLE `userinfo` ADD INDEX age ( `age` )  ;

添加组合索引

/*[10:19:13][355651 ms]*/ ALTER TABLE `userinfo` ADD INDEX usearch ( `id`,`age` )  ;

 

添加索引后再进行查询:

/*[10:21:12][  16 ms]*/ SELECT * FROM userinfo WHERE id=99999  LIMIT 0, 1000;

/*[10:21:40][  47 ms]*/ SELECT * FROM userinfo WHERE id>99999 AND age!=280 AND NAME='testuser' LIMIT 1 ;

/*[10:22:30][   0 ms]*/ SELECT * FROM userinfo WHERE id=9999999 AND age!=280 AND NAME='testuser' LIMIT 1 ;

 

添加索引后再插入1000万条数据用时:402秒,也就是说加主键和索引后插入1000万条数据时间只多用了153秒。

 

这时数据库中共有2000多万条数据了。再来看一下查询速度

/*[10:36:40][  31 ms]*/ SELECT * FROM userinfo WHERE id=99999  LIMIT 0, 1000;

/*[10:37:41][  47 ms]*/ SELECT * FROM userinfo WHERE id>99999 AND age!=280 AND NAME='testuser' LIMIT 1 ;

/*[10:38:11][  31 ms]*/ SELECT * FROM userinfo WHERE id=9999999 AND age!=280 AND NAME='testuser' LIMIT 1 ;

 

 

插入数据的PHP代码如下:

 

/*
 本程序用来测试数据库的压力
*/

set_time_limit(0);

/* 数据库链接 */
$db = mysql_connect('localhost', 'root', 'aaaaaa');
mysql_select_db('dbtest');

$start_time = time();

/* 插入数据 */
/*
$x = 0;
while($x < 10000000)
{
	$sql = "insert into userinfo values";
	$max = $x + 3000;
	$age = rand(1, 100);
	for($x; $x < $max; $x++)
	{
		$sql .= "('{$x}', 'testuser', '{$age}'),";
	}

	$sql = substr($sql, 0, -1);
	$res = mysql_query($sql);
	if ($res == true)
	{
		echo "{$x}-ok@<br />";
	}

	$x = $max;
}
*/
$x = 10000000;
while($x < 20000000)
{
	$sql = "insert into userinfo values";
	$max = $x + 3000;
	$age = rand(1, 100);
	for($x; $x < $max; $x++)
	{
		$sql .= "('{$x}', 'testuser', '{$age}'),";
	}

	$sql = substr($sql, 0, -1);
	$res = mysql_query($sql);
	if ($res == true)
	{
		echo "{$x}-ok@<br />";
	}

	$x = $max;
}

$use_time = time() - $start_time;
echo "插入1000万条数据共用时:".$use_time."秒";

 

为了证明我真的测试过,下面给出两张截图:

 

测试用例比较简单,但大致看来总体性能还是可以接受的。

加载中
0
gen
gen

8小时谣言不攻自破了。。

0
鉴客
鉴客

非常严谨,赞!!!

0
曾建凯
曾建凯
了解了,不错!
0
宏哥
宏哥

这个相当严谨,index这个我看来说错了,既然已经准备好了数据

能否增加一个测试,

创建一个userinfo1的表,从这个userinfo 随机取出200万记录放入userinfo.

也可以给定条件,有个1-200万即可,做not in 计算

然后查询记录数:

在userinfo 中存在同时不存在userinfo1的记录数量

0
宏哥
宏哥

还需要另外一个测试,增加一个字段,看看需要多少时间。

我昨天做了简单的几个小演示:

0
宏哥
宏哥

这两个测试应该是更大的挑战,mysql 建立一个新的 index是创建一个新的idx文件,相对容易些。

实际上,这个时候,您还可以做另外一个测试:

alter index usearch.

我相信这次应该不会那么轻松了

0
老盖
老盖

MySQL性能上比不过Oracle的是必然的,不然Oracle就没人买了,但是对于中小项目来说MySQL的简单轻量及免费的特点还是比较适合的。

0
宏哥
宏哥

引用来自#8楼“戏水”的帖子

MySQL性能上比不过Oracle的是必然的,不然Oracle就没人买了,但是对于中小项目来说MySQL的简单轻量及免费的特点还是比较适合的。

我上面做的测试,是基于 Pgsql,也是免费的,在我的D630 xp/sp3上的 Ubuntu 8.04.4/Pg 8.3.12.

机器是三年前公司配的,3G内存,分配Ubuntu 1G内存,我建议多试验,少谈结论

0
老盖
老盖

Pgsql没用过,不过我相信应该不错,但网上的使用经验和资料相对MySQL来说太少了,大部分的人都有求安逸的思想,如果没有明显的压倒性优势也就懒得换了

0
CheckStyle
CheckStyle

引用来自#10楼“戏水”的帖子

Pgsql没用过,不过我相信应该不错,但网上的使用经验和资料相对MySQL来说太少了,大部分的人都有求安逸的思想,如果没有明显的压倒性优势也就懒得换了

这倒是实情. 大家都按照习惯去走.

返回顶部
顶部