浏览 1569 次
|
锁定老贴子 主题:mysql 1000w级别的性能怎样?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-05-21 关键字: java mysql
今天早上来公司抽空做了一个简单的数据插入测试:
环境: OS: winxp service pack2 cpu: p4 2.8G 内存:1.5G db: mysql 5.0 创建my sql instance 设置为Server machine: 0 take 187. 测试结果: 5000 take 656. ............... 50000 take 5172. 55000 take 5844. 60000 take 6531. 65000 take 7203. 70000 take 7672. 75000 take 8187. 80000 take 8781. 85000 take 9234. 90000 take 9969. 95000 take 10640. 100000 take 11375 .... 200000 take 24469. ................. 500000 take 73156. 505000 take 74265. 510000 take 75172. .................. 1000000 take 184719. 1005000 take 186047. 1010000 take 187359. .................. 2000000 take 538422. 2005000 take 540250. 2010000 take 543125. .................... 3000000 take 1061750. 3005000 take 1064187. 3010000 take 1068187. ................... 3750000 take 1583109. .................... 以前测试如果是设成开发机环境,到10w数据就不行,看来内存对数据库的性能影响极大。 如果是在真的服务器环境(例如4 cpu, 8G内存,给mysql 设4G内存)估计到后面的出入速度也不会什么大的下降) 下面是表的结构:
stmt.execute("CREATE TABLE account" +
" (AC_id int(10) unsigned NOT NULL auto_increment," +
" AC_firstName varchar(45) NOT NULL,`AC_middleName` " +
"varchar(45) default NULL," + "AC_lastName varchar(45) NOT NULL," +
"AC_authName varchar(45) NOT NULL," +
"AC_authPassword varchar(45) NOT NULL," +
"AC_emailAddress varchar(45) default NULL," +
"AC_birthDay timestamp default '2007-04-24 20:55:22.468'," +
"AC_isClosed tinyint(1) default 0," + "PRIMARY KEY (AC_id)," +
"UNIQUE KEY AC_authName (AC_authName))" +
" ENGINE=InnoDB DEFAULT CHARSET=utf8;");
测试函数:
public static void importHugeAccountData(int number)
throws Exception {
Connection conn = getConnection();
Statement stmt = conn.createStatement();
stmt.execute("Delete from Account where AC_id > 100");
long startTime = System.currentTimeMillis();
for (int i = 0; i < (number / 1000); i++) {
StringBuffer sql = new StringBuffer();
sql.append(
"insert into account(AC_authName, AC_authPassword, AC_firstName, AC_lastName) values ");
for (int j = 0; j < 1000; j++) {
sql.append(("(\"" + UUID.randomUUID().toString() + "\", \"" +
UUID.randomUUID().toString() + "\", \"" +
UUID.randomUUID().toString() + "\", \"" +
UUID.randomUUID().toString() + "\"), "));
}
sql.delete(sql.length() - 2, sql.length() - 1);
stmt.execute(sql.toString());
if ((i % 5) == 0) {
System.out.println((i * 1000) + " take " +
(System.currentTimeMillis() - startTime) + ". ");
}
}
long time = System.currentTimeMillis() - startTime;
System.out.println(time);
}
这里有一个别人做的测试 http://jimcgnu.javaeye.com/blog/56550 有谁知道在其它数据库上(oracle, sql server)做的测试性能怎样? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-22
mysql在数据20W以上影响还是比较大的,上百万以后感觉用它已经很费力,内存表在30W以上就已经严重影响效率了,特别是插入删除变得非常慢。oracle好像比较高,其它数据库就没测试过了。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-22
qiezi 写道 mysql在数据20W以上影响还是比较大的,上百万以后感觉用它已经很费力,内存表在30W以上就已经严重影响效率了,特别是插入删除变得非常慢。oracle好像比较高,其它数据库就没测试过了。
不知道你有没有注意到我上面的测试数据: 即使数据到100w时,1.3秒仍能插入5000条记录,我想这个速度还是可以的。 你说的情况可能时没有设置内存大小,oracle一起动就占了几百M的内存。 而mysql设置为开发机环境时,它只占几十M内存。 我上面的测试前提是把mysql设置为服务机环境。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-05-25
20W 的数据对 MySQL 几乎没有任何影响,我这边的一个实际应用每5分钟就要产生几万条数据(几千台设备的流量数据),然后放到数据库,之后每隔5分钟就要把一个时段的数据取出来画流量图,还用聚合运算。
就这样下来,数据库上200W+的数据相应速度还是很快的,之前没有给表加索引,导致每次查数据都把所有数据访问了一遍,用explain可以看到,加过索引之后速度有明显上升。 不要因为 Oracle 是商业产品就觉得性能有多高,个人感觉能用 Oracle 的还主要是关注稳定性。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-06-01
昨天有空测了mysql,
在一个小时居然能导入1亿4千万条记录。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-06-01
1000W级的表,mysql的性能会出现比较明显的下降,我的经验是500W以上就要考虑分表了。前提是访问量很大的情况下。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-06-13
晕,你们都说记录数。。
还要看每条记录所包含的内容,索引的定义,数据库的配置等。 |
|
| 返回顶楼 | |







