SQLite 性能优化实例分享

来源:脚本之家  责任编辑:小易  

章子怡和汪峰的婚姻,令很多人大跌眼镜,也令很多人疑惑不已——为什么是他们俩呢?似乎CP感不强啊?其实细琢磨之下,这对儿最终能修成正果,目前看还挺美满的才子佳人,还真正是:志趣相投的典型。现在,让我们给他俩“合”一下婚:第一,地域合。虽然汪峰祖籍江苏,但他生于北京长于北京,而章子怡也是典型的北京大妞。两口子在同一个地方,生活习惯差不多,饮食习惯差不多,你喝豆汁我吃卤煮,谁也不嫌谁味儿。第二,学历合,汪峰毕业于音乐的高等学府——中央音乐学院,章子怡毕业于演员的最高学府——中央戏剧学院。这样两口子吵架,谁也不敢说对方没文化,毕业证甩脸上:骂谁呢?你是骂我还是骂我们母校啊?第三,水平合,汪峰在音乐上的

最早接触 iOS 开发了解到的第一个缓存数据库就是 SQLite,后面一直也以 SQLite 作为中坚力量使用,以前没有接触到比较大量数据的读写,所以在性能优化方面关注不多,这次对一个特定场景的较多数据批量读写做了一个性能优化,使性能提高了十倍。

广州迎春花市是广东省的汉族传统民俗文化盛会,广州人民的一场嘉年华。一年一度的迎春花市繁花似锦、人海如潮,热闹非凡。作为明代\"广东四市\"之一的广州迎春花市,早就名扬五洲,饮誉四海。迎春花市是中国独一无二的民俗景观。其不但呈现了古老的岭南地区汉族群众的春节习俗,更与广州人的生活密切相关,迎春花市融合了广州人\"讲意头\"的传统,从而形成了自己独特的花卉语言。首先,迎春花市提醒人们春节将至,是时候为除旧迎新做准备了,例如置办年货、大扫除等,同时也通过搭建花市牌楼、摆卖年花等营造过年的欢乐气氛。年年有新花样,也开阔了市民的眼界。市民在花市上既能看到国内外的各色花卉,又能品尝到各种地方特色小食,观看

大致应用场景是这样:

使用食材制作主料:带皮肥瘦肉400克制作辅料:蒸肉粉4分之1匙生抽少许姜少许鸡精一小匙做法原料猪肉洗干净,切成片,不要太薄也不要太厚加蒸肉粉、姜丝、生抽,用筷子拌均匀,让肉粘满蒸肉粉,并腌制1个小时蒸锅加水烧开,放上粉蒸肉蒸30--40分钟,就可以出锅了特色看完这些,是不是觉得很简单?以前家里做的就没这么简单了,奶奶做的蒸肉粉都是自己拿糯米炒香,再用石头锤舂成碎粉,自己再加些调料:草果,八角,茴香,食盐等,而现在想吃了,也没那么麻烦,直接去买包蒸肉粉就可以回来做。但也少了那种别样的心情。小贴士其实做粉蒸肉最好就是选五花肉,不过昆明的五花肉肥肉太多了,根本看不到瘦肉,那样的肉,猪头是不肯吃的,只

每次程序启动会从服务器拉取一些数据,对本地数据库两个表进行同步更新,不存在就写入,存在就更新其字段。数据少的时候几十条,多的上千条。

新赛季英超联赛开始前,鲁尼被从曼联交易到了埃弗顿。相信本赛季鲁尼身穿埃弗顿蓝色战袍回到曼联主场时,全场曼联球迷一定会为老队长献上最热烈的掌声。鲁尼虽然是埃弗顿青少年体系培养出来的球员,也成名与埃弗顿,但是他在2004年19岁的时候就转会到了曼联。在为曼联队效力的13年间,鲁尼出场559次,在红魔历史上排名第六,攻入了253个进球,排名曼联队史第一。英超冠军、足总杯冠军,欧冠冠军,欧洲联赛冠军,鲁尼几乎帮助曼联队拿到了所有锦标冠军。最近两个赛季,鲁尼在曼联的核心地位逐渐动摇,但是无论是范加尔还是穆里尼奥,鲁尼都没有和他们有过损害球队利益的冲突。本赛季转会埃弗顿,其实也是鲁尼为曼联队做得最后一项贡

由于缓存的数据可能会存在异步同时读写,所以做了一个后台同步队列,所有的缓存数据库操作都在这个队列里面,然后我监控了一下写数据库的关键代码执行耗时,一千条数据更新到数据库就能耗时 30 秒之久,磁盘写入在 1.5M/s 浮动, 虽然没有卡主线程,这个消耗即使在后台也是不可容忍的。

核心的数据库操作大概是这样的

for 1000 : { Select -> Update Or Insert Select -> Update Or Insert }

由于牵涉到两张表,所以会有两次,经过测试,Select 一次几乎没有多少消息,可是 Update 或者 Insert ( [FMDatabaseQueue executeUpdate:] ) 就消耗大了,因为会写入磁盘,然后想到是不是可以把所有的 SQL 语句拼接起来,最后只想一次;再后来想到 SQLite 不是有事务 ( Transaction ) 嘛,于是尝试了一下利用 FMDB 的事务操作,在循环开始前 [db beginTransaction] ,循环结束 [db commit],包起来就行了。

增加事务之后的大概逻辑:

beginTransaction for 1000 : { Select -> Update Or Insert Select -> Update Or Insert } commit

测试效果非常好,整个耗时从 30 秒下降到了2.8 秒左右,仅仅增加了两行代码。

总结:

踩过的坑,走过的坎,都是以后的经验

虽然利用事务取巧来提高了性能,但是这样做其实并不安全,好在所属场景对这部分数据绝对一致要求不是太高。

模拟器和真机有时候测试并不能重现同一个问题,因为所属架构、CPU、硬盘都不一样,所以性能测试最好还是以真机为准。该问题测试的时候在模拟器上很多问题都没有,因为硬盘比真机读写速度要高,所以避免了很多问题,测试的时候也就没有发现。

数据库设计设计的时候得多考虑考虑,多想想以后怎么扩展,怎么升级,读写的时候性能怎么样

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

求sqlite数据库索引创建语句或性能优化方案

第1条语句,跟create_time索引没关系

第2条语句,应该不会使用create_time索引,因为即便用了索引最后还是要读表数据,还不如直接全表读数据然后在内存中排序快

第3条语句,不知道0到1383525367的create_time选出的记录数相对于全表记录数的比率有多大,太多了应该也不会使用索引,因为最后还是要读一遍表数据,如果比率比较小应该会用上索引追问你好,谢谢你的回答,不过,创建单个的create_time索引确实可以提升速度,但不是很明显,我想知道如何建索引或者如何写sql语句可以使他的速度提升。追答在text上建立索引,效率没明显提高,这是跟数据相关的。1是看选择率,就是选出的记录总数占所有记录总数的比例,太高了索引无效,因为数据库都是按块存储的,每次读至少一块,最后的结果可能是索引读一遍,但数据所有的块还是全读了一遍;2是看数据分布,譬如每块能存100条记录,name='123456789'的记录总数虽然只总记录数的1%,但正好每块都有一条,这样依然会把所有数据块都要读一遍,此时先读索引也提高不了效率,象oracle之类的大型数据库就会选择全表扫描。

sqlite大数据库怎样进行性能优化

从上图中我们会很清晰的看到通过普通方式插入 10000 条数据和开启事务插入 10000 条数据之间的差异,整整差了 83 秒。下面我们来看测试代码:

package cn.sunzn.sqlitedatabase;

import android.app.Activity;

import android.content.ContentValues;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.Menu;

import android.view.View;

import android.widget.EditText;

  • 本文相关:
  • sqlite优化方法
  • android创建数据库(sqlite)保存图片示例
  • sqlite3中的日期时间函数使用小结
  • sqlite3中自增主键相关知识总结
  • c#操作sqlite方法实例详解
  • sqlite教程(三):数据表和视图简介
  • 基于sqlite特殊字符转义的实现方法
  • sqlite教程(十三):c语言编程实例代码(1)
  • sqlite3中的日期时间函数使用小结
  • sqlite数据库管理系统-我所认识的数据库引擎
  • 保护你的sqlite数据库(sqlite数据库安全秘籍)
  • sql中使用escape定义转义符详解
  • sqlite3中自增主键相关知识总结
  • sqlite中的wal机制详细介绍
  • sqlite 常用函数 推荐
  • 求sqlite数据库索引创建语句或性能优化方案
  • sqlite大数据库怎样进行性能优化
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved