测试环境:centor OS 4.5 kernel 2.6.9 4G内存,Intel(R) Xeon(TM) CPU 2.80GHz 双核双处理器
配置文件postgresql.conf配置参数:(其实都是默认的)
shared_buffers = 24MB
temp_buffers = 8MB
一个包含6个字段的表,一个主键,一个varchar(255)的字符串,其他4个为int4类型
数据记录180万。其中的字符串字段,记录是不同的随机的url,每个都不相同。
没有其他索引等。测试过程中某些操作与mysql5.0.51作了对比,mysql数据的硬件与此测试使用的硬件完全相同,也是没有做个什么优化,都使用默认的配置参数。
测试方向主要有count, sum, avg, order by, group by, like, limit xxx offset yyyy语句以及+、-、*、/、取余、取模的SELECT操作,插入记录操作的用时, 创建索引, 删除索引。
171万记录 |
PostgreSQL 8.3 beta 4 |
MySQL 5.0.51 InnoDB |
count(*) |
0.480 sec |
常数时间,在0.01 sec 内 |
sum 一个字段 |
0.630 sec |
2.45 sec |
sum 两个字段 |
0.771 sec (多用时 22.38%) |
2.73 sec (多用时 11.43%) |
sum 三个字段 |
0.956 sec (多用时 51.75%) |
2.95 sec (多用时 20.41%) |
sum 四个字段 |
1.079 sec (多用时 70.63%) |
3.24 sec (多用时 32.24%) |
sum 五个字段 |
1.197 sec (多用时 90.00%) |
3.53 sec (多用时 44.08%) |
avg 一个字段 |
0.673 sec |
2.45 sec |
avg 两个字段 |
0.882 sec (多用时 31.05%) |
2.74 sec (多用时 11.43%) |
avg 三个字段 |
1.014 sec (多用时 50.67%) |
3.03 sec (多用时 23.67%) |
avg 四个字段 |
1.109 sec (多用时 67.78%) |
3.28 sec (多用时 33.88%) |
avg 五个字段 |
1.237 sec (多用时 83.80%) |
3.61 sec (多用时 47.35%) |
order by 唯一主键 (asc desc) |
1.021 sec 第一次查询用时 10.328 sec |
2 min 53.84 sec 第一次查询用时 4 min 47.20 sec |
group by 整数字段 |
1.090 sec 首次查询4.882 sec |
3.18 sec 首次查询 14.05 sec |
group by 字符串字段(基本不同的随机url, 字段带索引) |
2.176 sec |
42.18 sec |
like 字符串字段(基本不同的随机url,字段带索引) |
0.912 sec (返回空结果集) |
4.83 sec (返回空结果集) |
like 字符串字段(基本不同的随机url,不带索引) |
0.920 sec (返回空结果集) |
4.82 sec (返回空结果集) |
= 字符串字段(基本不同的随机url,不带索引) |
0.617 sec (返回1结果集) |
3.81 sec (返回1结果集) |
创建索引 字符串字段(基本不同的随机url,平均长度100) |
87.851 sec |
47.41 sec |
删除索引 字符串字段(基本不同的随机url,平均长度100) |
0.049 sec |
21.70 sec |
注:
count(*) 操作 PostgreSQL需要扫描全表,而MySQL则有缓存表中记录数的机制,在写库的时候就已经算出来了,所以取完全的表记录数MySQL用时就为常数时间了。
以上操作都是没有任何where条件限制,计算过程包括表中所有记录。
结论:
like 与对应字段上是否有索引没有关系;
在没有索引的字符串字段上,=查找需要扫描全表,但PostgreSQL明显要快。有索引的=查找,MySQL在0.01 sec 内, PostgreSQL可达到0.002内。
创建索引PostgreSQL慢于MySQL,是否可得出结论 INSERT 操作PostgreSQL 也同样慢于MySQL呢?
|