SQLite速度惊人。用450万个记录A测试表具有结构:
CREATE TABLE testtable (numericid INTEGER PRIMARY KEY, testtext TEXT);
它填充有用于numericid(0,1,...)和testtext字符串增加的值。
在MacBook Pro(2009)上以原子方式执行所有插入操作需要1小时42分钟。生成的SQLite文件大小为94 MB。
在iOS应用程序中,数据库在viewDidLoad方法中打开。一个简单的按钮触发数据库查询这样的:
- (void)btnPressed:(UIButton *)sender{
NSLog(@"btn pressed, start");
sqlite3_stmt *statement = nil;
NSString *querystring;
querystring= [NSString stringWithFormat:@"SELECT * FROM testtable WHERE numericid = 2571312;"];
const char *sql = [querystring UTF8String];
NSLog(@"sql is: %s", sql);
if (sqlite3_prepare_v2(dbConnection, sql, -1, &statement, NULL)!=SQLITE_OK){
NSLog(@"sql problem occured with: %s", sql);
NSLog(@"%s", sqlite3_errmsg(dbConnection));
}
else
{
while (sqlite3_step(statement) == SQLITE_ROW) {
NSString *numericid = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)];
NSString *testtext = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)];
NSLog(@"%@",[NSString stringWithFormat:@"%@ (%@)", numericid, testtext]);
} // while
}
sqlite3_finalize(statement);
NSLog(@"btn pressed, finished");
}
结果的输出:
2012-08-10 17:51:36.734 DBQueryTest[28462:707] Database Successfully Opened
2012-08-10 17:51:39.083 DBQueryTest[28462:707] btn pressed, start
2012-08-10 17:51:39.087 DBQueryTest[28462:707] sql is: SELECT * FROM testtable WHERE numericid = 2571312;
2012-08-10 17:51:39.099 DBQueryTest[28462:707] text2571312 (2571312)
2012-08-10 17:51:39.102 DBQueryTest[28462:707] btn pressed, finished
所以查询所需19ms下!虽然我没有为统计评估运行完全随机化的测试,但可以复制几个numericid值。
结论:此测试设置满足您的要求。 SQLite绝对是一种方式。
UPDATE:
100000个键值快速随机存取测试验证的第一个结果。离开SQL语句字符串创建和费时的NSLog输出了时间测量,平均数据库查询时间减少幅度为订单:
平均查询时间:1.8毫秒
平均偏差: 0.4毫秒
最大查询时间:25.9毫秒
最小查询时间:0.6毫秒
你真的试过这样做吗?花费数小时的时间将450万张记录表加载到Core Data中,然后在iPad上打开一个测试应用程序,以查看您获得结果的速度。你会得到一个关于数据大小和性能的实际概念,你不必猜测。 – Abizern 2012-08-10 13:45:24
查看问题中的最后一句。我们有一个iPad,但没有开发许可证或Mac,这不是一个问题,但只是不能用于测试。我也应该说,这些都是小记录,每个小于500字节。 – Paystey 2012-08-10 13:48:50
你可以请一个有开发账户和iPad的人来构建和安装它,看看结果是什么样的。或者让他们将你的设备添加到他们的开发者账户,他们可以发送给你,让你可以看到自己的样子。 – Abizern 2012-08-10 13:51:59