改造了一下AR的测试脚本(见附件),测试在大表下的AR全方位性能。
经过测试发现,有索引的情况下,ActiveRecord的CRDU都可以保证在0.1-1ms下完成。但在没有索引的情况下,遍历全表,就很意思了!
1. 遍历:一万条记录遍历在5-11ms, 在可用性范围内。但一百万条记录,在0.6-2s内,显示达不到可用性要求了。百万条记录查找一定要有索引。
2. 非平衡:对两张不同的表(记录数)相同,查找性能是截然不同的。 exhibit表里有大字段,查找性能就比user表差很多。
3. 非线性:随着纪录数增加,遍历查找性能下降(非线性下降)。由其是含有大字段数据的表。exhibit在一万条记录下是11.060ms, 在一百万条记录不是1100ms, 而是1892ms.
测试数据:
10,000 records
| AR |
------------------------------------------------------------------
create 10_000 records x1 | 29.919 |
Model.first x1000 | 0.275 |
Model.all limit(100) x1000 | 7.454 |
Model.all limit(100) with relationship x1000 | 13.036 |
Model.all limit(10,000) x10 | 7.415 |
Model.create x1000 | 1.240 |
Resource#update x1000 | 0.775 |
Resource#destroy x1000 | 1.066 |
Model.find(id) x1000 | 0.239 |
Model.find_by_sql x1000 | 0.105 |
Model.find_by_name in user x1000 | 5.936 |
Model.find_by_name in exhibit x1000 | 11.060 |
1,000,000 records
| AR |
------------------------------------------------------------------
create 1_000_000 records x1 | 3112.17 |
Model.first x1000 | 0.279 |
Model.all limit(100) x1000 | 7.504 |
Model.all limit(100) with relationship x1000 | 13.000 |
Model.all limit(10,000) x10 | 7.436 |
Model.create x1000 | 1.235 |
Resource#update x1000 | 0.765 |
Resource#destroy x10 | 0.009 |
Model.find(id) x1000 | 0.240 |
Model.find_by_sql x1000 | 0.121 |
Model.find_by_name in user x10 | 6.359 |
Model.find_by_name in exhibit x10 | 18.952 |
测试脚本