`

Android性能优化之数据库优化

阅读更多

最新最准确内容建议直接访问原文:性能优化之数据库优化

本文为性能优化的第一篇——数据库性能优化,原理适用于大部分数据库包括Sqlite、Mysql、Oracle、Sql server,详细介绍了索引(优缺点、分类、场景、规则)和事务,最后介绍了部分单独针对Sqlite的优化

 

性能优化专题已完成五部分:

性能优化总纲——性能问题及性能调优方式
性能优化第三篇——Java(Android)代码优化
性能优化第二篇——布局优化
性能优化第一篇——数据库性能优化

性能优化实例 
1、索引
简单的说,索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据,而不用全表扫描,合适的索引可以大大提高数据库查询的效率。
(1). 优点
大大加快了数据库检索的速度,包括对单表查询、连表查询、分组查询、排序查询。经常是一到两个数量级的性能提升,且随着数据数量级增长。

 

(2). 缺点
索引的创建和维护存在消耗,索引会占用物理空间,且随着数据量的增加而增加。
在对数据库进行增删改时需要维护索引,所以会对增删改的性能存在影响。

 

(3). 分类
a. 直接创建索引和间接创建索引
直接创建: 使用sql语句创建,Android中可以在SQLiteOpenHelper的onCreate或是onUpgrade中直接excuSql创建语句,语句如

 

b. 普通索引和唯一性索引
普通索引:

 

c. 单个索引和复合索引

单个索引:索引建立语句中仅包含单个字段,如上面的普通索引和唯一性索引创建示例。
复合索引:又叫组合索引,在索引建立语句中同时包含多个字段,语句如:

 

d. 聚簇索引和非聚簇索引(聚集索引,群集索引)
聚簇索引:物理索引,与基表的物理顺序相同,数据值的顺序总是按照顺序排列,语句为:

非聚簇索引:

 

(4). 使用场景
在上面讲到了优缺点,那么肯定会对何时使用索引既有点明白又有点糊涂吧,那么下面总结下:
a.  当某字段数据更新频率较低,查询频率较高,经常有范围查询(>, <, =, >=, <=)或order by、group by发生时建议使用索引。并且选择度越大,建索引越有优势,这里选择度指一个字段中唯一值的数量/总的数量。
b.  经常同时存取多列,且每列都含有重复值可考虑建立复合索引

 

(5). 索引使用规则
a.  对于复合索引,把使用最频繁的列做为前导列(索引中第一个字段)。如果查询时前导列不在查询条件中则该复合索引不会被使用。
如create unique index PK_GRADE_CLASS on student (grade, class)
select * from student where class = 2未使用到索引
select * from dept where grade = 3使用到了索引

 

b.  避免对索引列进行计算,对where子句列的任何计算如果不能被编译优化,都会导致查询时索引失效
select * from student where tochar(grade)=’2′
c.  比较值避免使用NULL
d.  多表查询时要注意是选择合适的表做为内表。连接条件要充份考虑带有索引的表、行数多的表,内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。实际多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。

 

e.  查询列与索引列次序一致
f.  用多表连接代替EXISTS子句
g.  把过滤记录数最多的条件放在最前面
h.  善于使用存储过程,它使sql变得更加灵活和高效(Sqlite不支持存储过程::>_<:: )

 

(6)索引检验

建立了索引,对于某条sql语句是否使用到了索引可以通过执行计划查看是否用到了索引。

 

2、使用事务
使用事务的两大好处是原子提交和更优性能。
(1) 原子提交
原则提交意味着同一事务内的所有修改要么都完成要么都不做,如果某个修改失败,会自动回滚使得所有修改不生效。

 

(2) 更优性能
Sqlite默认会为每个插入、更新操作创建一个事务,并且在每次插入、更新后立即提交。

这样如果连续插入100次数据实际是创建事务->执行语句->提交这个过程被重复执行了100次。如果我们显示的创建事务->执行100条语句->提交会使得这个创建事务和提交这个过程只做一次,通过这种一次性事务可以使得性能大幅提升。尤其当数据库位于sd卡时,时间上能节省两个数量级左右。

Sqlte显示使用事务,示例代码如下:

 

3、其他优化
(1) 语句的拼接使用StringBuilder代替String
这个就不多说了,简单的string相加会导致创建多个临时对象消耗性能。StringBuilder的空间预分配性能好得多。如果你对字符串的长度有大致了解,如100字符左右,可以直接new StringBuilder(128)指定初始大小,减少空间不够时的再次分配。

 

(2) 读写表

在写表时调用sqliteOpenHelper..getWritableDatabase(),在读表时候调用sqliteOpenHelper..getReadableDatabase(),getReadableDatabase性能更优。

 

(3) 查询时返回更少的结果集及更少的字段。
查询时只取需要的字段和结果集,更多的结果集会消耗更多的时间及内存,更多的字段会导致更多的内存消耗。

 

(4) 少用cursor.getColumnIndex

根据性能调优过程中的观察cursor.getColumnIndex的时间消耗跟cursor.getInt相差无几。可以在建表的时候用static变量记住某列的index,直接调用相应index而不是每次查询。

4、异步线程
Sqlite是常用于嵌入式开发中的关系型数据库,完全开源。
与Web常用的数据库Mysql、Oracle db、sql server不同,Sqlite是一个内嵌式的数据库,数据库服务器就在你的程序中,无需网络配置和管理,数据库服务器端和客户端运行在同一进程内,减少了网络访问的消耗,简化了数据库管理。不过Sqlite在并发、数据库大小、网络方面存在局限性,并且为表级锁,所以也没必要多线程操作。

 

Android中数据不多时表查询可能耗时不多,不会导致anr,不过大于100ms时同样会让用户感觉到延时和卡顿,可以放在线程中运行,但sqlite在并发方面存在局限,多线程控制较麻烦,这时候可使用单线程池,在任务中执行db操作,通过handler返回结果和ui线程交互,既不会影响UI线程,同时也能防止并发带来的异常。实例代码如下:

你可能还感兴趣:

Android 查看sqlite数据库中的数据以及sqlite3的常用命令

Android性能调优

Android 图片内存缓存

Android 图片SD卡缓存

Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)

分享到:
评论

相关推荐

    Android性能优化.pdf

    【Android性能优化】是Android开发中的重要环节,涵盖了多个关键领域,包括ANR问题解析、crash监控方案、启动速度与执行效率优化、内存优化、耗电优化、网络传输与数据存储优化以及APK大小优化。 **ANR问题解析**是...

    面试Android性能优化

    本专题将深入探讨Android性能优化的关键知识点,帮助开发者提升应用的运行效率和用户体验。 首先,我们要理解Android性能优化的基本原则:减少资源消耗、提高响应速度、降低内存占用以及提升电池续航。在Java编程...

    免费:Android性能优化视频百度云下载链接.rar

    这个"免费:Android性能优化视频百度云下载链接.rar"的压缩包文件提供了一个学习资源,可能是由一系列视频教程组成,帮助开发者深入理解和掌握Android应用的性能调优技巧。虽然没有直接提供视频内容,但包含的"免费...

    Android应用性能优化

    ### Android应用性能优化 在移动开发领域,特别是针对Android平台的应用开发过程中,性能优化是确保应用流畅运行、提升用户体验的关键环节。本篇文章将围绕“Android应用性能优化”这一主题,详细探讨Android应用...

    Android应用性能优化_人民邮电出版社

    Android 应用性能优化 Android 应用性能优化是指通过各种技术和方法来提高 Android 应用程序的运行速度、响应速度和总体性能的过程。这包括优化应用程序的代码、数据库、网络请求、内存管理、图形渲染、缓存机制等...

    android文件存储之数据库

    11. **数据库性能优化** 为提高性能,可以考虑索引、批量操作、适当的数据类型选择、及时关闭Cursor和数据库连接等策略。 通过学习以上知识点,开发者可以熟练地在Android应用中实现数据库的基本操作。结合实际...

    Android应用性能优化.pdf

    根据提供的文件信息,“Android应用性能优化.pdf”这一文档主要聚焦于Android应用的性能优化方法与实践。虽然部分内容涉及社群推广信息,并未直接提供具体的性能优化技术细节,但我们可以通过标题及描述推断出文档的...

    《Android应用性能优化》

    总的来说,《Android应用性能优化》是一本全面讲解Android性能提升的指南,它可以帮助开发者构建更加高效、稳定和用户友好的应用程序。虽然技术日新月异,但基本的优化原则和技巧依然有效,对于任何Android开发者来...

    android 性能优化文章

    11. **其他未提及的优化点**:可能包括资源压缩、代码混淆、后台服务管理、网络请求优化、数据库查询优化等,都是Android性能优化的重要组成部分。 总的来说,Android性能优化是一个持续的过程,需要开发者深入了解...

    android应用性能优化最佳实践读书笔记

    在Android应用开发中,性能优化是一项至关重要的任务,它直接影响到用户的体验和应用程序的市场竞争力。"Android应用性能优化最佳实践"这本书深入探讨了如何提升Android应用的性能,以下是一些核心知识点的总结: 1...

    Android应用性能优化【高清】

    根据提供的标题“Android应用性能优化【高清】”和描述“Android应用性能优化【高清】”,本文将深入探讨Android应用性能优化的关键技术与实践方法。由于提供的部分内容主要为重复的网站链接,这部分内容将不会被...

    Android用listview显示数据库中的数据

    9. **优化性能**:对于大量的数据,为了提高性能和用户体验,可以使用`ViewHolder`模式来缓存列表项的视图,避免频繁的视图创建和销毁。 在压缩包`ListViewShowFile`中,可能包含了实现上述步骤的代码示例,如网络...

    an_mysql.rar_ android Mysql_Android 数据库_Android数据库_MYSQL_android

    5. **数据安全与性能优化**: 为了保护用户数据,避免明文存储敏感信息(如数据库凭证)。同时,减少不必要的网络请求,可以考虑缓存数据或者使用更高效的查询策略。 6. **Android SQLite**: 考虑到离线场景和性能,...

    Android性能优化技术在某体重管理APP中的应用研究.pdf

    Android性能优化技术在某体重管理APP中的应用研究 Android性能优化技术是 Android 应用开发中一个非常重要的方面。随着 Android 操作系统的普及, Android 应用程序的数量也在不断增加。为了在众多应用程序中...

    《Android应用性能优化》.(埃尔韦).[PDF]

    1. **Android性能优化的重要性**:一个高性能的应用能够提升用户体验,降低功耗,提高应用的市场竞争力。 2. **性能瓶颈分析**:常见的性能问题包括但不限于启动速度慢、UI卡顿、内存泄漏等。这些问题往往会影响...

    Android 源码之数据库相关代码信息页

    7. **数据库性能优化** - 使用合适的数据类型减少存储空间。 - 避免在SQL语句中使用硬编码的值,而是使用参数化查询。 - 使用索引提高查询速度,但创建过多的索引会影响写操作性能。 - 适时使用`TRUNCATE`而非`...

    _db_Handler.zip_Android 数据库_Android__Android数据库_手机 数据库

    在性能优化方面,可以创建数据库索引来加速查询,使用`PRAGMA`语句检查和调整数据库配置,比如缓存大小和事务模式。此外,避免在主线程中进行耗时的数据库操作,以免引起应用卡顿,可以使用异步任务或Android的...

    android数据库应用实例

    综上所述,Android数据库应用实例主要涵盖了SQLite的使用、数据操作、数据库版本管理、性能优化等多个方面,通过实例代码MyDatabase,我们可以深入理解并掌握这些知识,为开发高效、可靠的Android应用程序奠定基础。

    Android数据库SQLite详解

    在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的、开源的、嵌入式的SQL数据库引擎,被广泛用于存储和管理应用程序中的数据。SQLite具有高效、可靠且易于集成的特点,使得它成为Android应用数据...

Global site tag (gtag.js) - Google Analytics