FMDB高效存储海量数据技巧分享,轻松实现数据库优化与管理

文章导读
使用事务批量插入数据是FMDB高效存储海量数据的关键技巧。在插入大量数据时,避免逐条执行INSERT语句,而是开启一个事务,将所有插入操作包裹在beginTransaction和commit中,这样可以大大减少数据库的I/O开销。例如:[self.db beginTransaction]; for (int i=0; i
📋 目录
  1. 技巧一:批量插入
  2. 索引优化
  3. 使用WAL模式
  4. 分表分库策略
  5. 内存缓存结合
  6. 数据压缩存储
A A

使用事务批量插入数据是FMDB高效存储海量数据的关键技巧。在插入大量数据时,避免逐条执行INSERT语句,而是开启一个事务,将所有插入操作包裹在beginTransaction和commit中,这样可以大大减少数据库的I/O开销。例如:[self.db beginTransaction]; for (int i=0; i<10000; i++) { [self.db executeUpdate:@"INSERT INTO table (col) VALUES (?)" , @(i)]; } [self.db commit]; 这比单条插入快10倍以上。

技巧一:批量插入

FMDB支持批量执行SQL语句,使用FMDatabaseQueue来处理并发写入。创建队列后,在队列的inDatabase块中执行批量插入,避免主线程阻塞。代码示例:FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:dbPath]; [queue inDatabase:^(FMDatabase *db) { [db beginTransaction]; for (...) { [db executeUpdate:...]; } [db commit]; }]; 这能轻松处理百万级数据插入。

索引优化

为频繁查询的字段创建索引,但不要过度索引。插入海量数据前,删除不必要的索引,数据导入完成后重建。示例:[db executeUpdate:@"CREATE INDEX idx_name ON table(col)"]; 对于时间戳或ID字段,优先建索引,能将查询速度提升百倍。

FMDB高效存储海量数据技巧分享,轻松实现数据库优化与管理

使用WAL模式

将SQLite设置为WAL模式,能提高并发读写性能。在打开数据库后执行:[db executeUpdate:@"PRAGMA journal_mode=WAL;"]; 这让读写操作并行进行,非常适合海量数据场景,避免传统rollback journal的锁竞争。

分表分库策略

海量数据时,按时间或用户ID分表存储。比如每天一张表,月份归档旧表。代码中动态生成表名如table_202301,插入时选择对应表,查询时union或分别查,管理起来简单高效。

FMDB高效存储海量数据技巧分享,轻松实现数据库优化与管理

内存缓存结合

结合NSCache或第三方缓存库,先缓存热点数据到内存,减少数据库访问。对于海量日志数据,只存增量,定期归档到历史表,保持主表轻量。

FMDB高效存储海量数据技巧分享,轻松实现数据库优化与管理

数据压缩存储

对文本或JSON数据用NSKeyedArchiver序列化后存BLOB字段,或用zlib压缩。插入前压缩,查询后解压,节省50%存储空间,特别适合大文本海量存储。

FAQ
Q: FMDB插入百万数据要多久?
A: 使用事务和队列,大概几分钟,视设备而定。
Q: 怎么避免数据库锁死?
A: 用FMDatabaseQueue处理多线程,并用WAL模式。
Q: 分表怎么查询跨表数据?
A: 用临时视图或分别查询后合并数组。
Q: 数据库文件太大怎么办?
A: 定期VACUUM清理,结合分表归档。