淺談FMDB事務批量更新操作耗時

當談到“事務”時,我想到了sqlite本身是支持事務操作的,FMDB作爲sqlite的上層封裝也對事務進行了支持,那麼說了這麼多給不瞭解“事務”這個詞的同學解釋一下吧:通常一次 sqlite3_exec 就是一次事務,假如你要對數據庫中的Stutent表插入新數據,那麼該事務的具體過程是:開始新事物->插入數據->提交事務,那麼當我們要往該表內插入500條數據,如果按常規操作處理就要執行500次“開始新事物->插入數據->提交事務”的過程。

好吧,今天的重點來了,舉個例子:假如北京的一家A工廠接了上海一家B公司的500件產品的訂單,思考一下:A工廠是生產完一件立即就送到B公司還是將500件產品全部生產完成後再送往B公司?答案肯定是後者,因爲前者浪費了大量的時間、人力物力花費在往返於北京和上海之間。同樣這個道理也能用在我們的數據庫操作上。

測試代碼:

    NSDate *date1 = [NSDate date];

    //0.453秒
    for (int i = 0; i < 500; i ++) {
        [self.queue inDatabase:^(FMDatabase *db) {
            [self insertItemWithDB:db];
        }];
    }

    //0.286秒
    [self.queue inDatabase:^(FMDatabase *db) {
        for (int i = 0; i < 500; i ++) {
            [self insertItemWithDB:db];
        }
    }];

    //0.303秒
    for (int i = 0 ; i < 500; i ++) {
        [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
            [self insertItemWithDB:db];
        }];
    }

    //0.015秒
    [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        for (int i = 0 ; i < 500; i ++) {
            [self insertItemWithDB:db];
        }
    }];

    NSDate *date2 = [NSDate date];
    NSTimeInterval a = [date2 timeIntervalSince1970] - [date1 timeIntervalSince1970];
    NSLog(@"插入500條數據用時%.3f秒",a);
發佈了15 篇原創文章 · 獲贊 201 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章