Android性能优化——数据库优化及其对比,真香

本文讨论了在大数据量场景下使用Sqlite进行异步操作的必要性,包括异步线程处理、并发控制、索引优化以及性能对比,建议使用单线程池和避免过多使用cursor.getColumnIndex方法以提高效率。
摘要由CSDN通过智能技术生成

7、耗时异步化(大数据量操作时最好用异步线程处理)

tip:Sqlite是常用于嵌入式开发中的关系型数据库,完全开源。与Web常用的数据库Mysql、Oracle db、sql server不同,Sqlite是一个内嵌式的数据库,数据库服务器就在你的程序中,无需网络配置和管理,数据库服务器端和客户端运行在同一进程内,减少了网络访问的消耗,简化了数据库管理。不过Sqlite在并发、数据库大小、网络方面存在局限性,并且为表级锁,所以也没必要多线程操作。Android中数据不多时表查询可能耗时不多,不会导致anr,不过大于100ms时同样会让用户感觉到延时和卡顿,可以放在线程中运行,但sqlite在并发方面存在局限,多线程控制较麻烦,这时候可使用单线程池,在任务中执行db操作,通过handler返回结果和ui线程交互,既不会影响UI线程,同时也能防止并发带来的异常。实例代码如下:

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

singleThreadExecutor.execute(new Runnable() { //建立异步线程处理

@Override

public void run() { // 执行sql操作数据库后发送消息

db.insert(yourTableName, null, value);

handler.sendEmptyMessage(xx);

}

}

);

二、查询优化的方法


我们在使用SQLite进行数据存储查询的时候,要进行查询优化,这里就会用到索引,Client端的数据量大部分情况下面虽然不是很大,但良好的索引建立习惯往往会带来不错的查询性能提升,同时在未知的将来经得住更大数据的考验,那如何优化数据库查询呢,下面我们用例子来演示下

先建个测试表test,包含了三个索引:

sqlite> .schem

CREATE TABLE test(id integer primary key not null default 0,a integer,b integer, c integer);

CREATE INDEX a_i on test(a);

CREATE INDEX a_i2 on test(a,b);

CREATE INDEX a_i3 on test©;

之后EXPLAIN QUERY PLAN:

sqlite> explain QUERY PLAN select * from test;

0|0|0|SCAN TABLE test

这条SQL语句是查询了整张表,所以结果关键字SCAN表示要完整遍历,这种效率是最低的,接下来我们试试加个查询条件:

sqlite> explain QUERY PLAN select * from testwhere a=1;

0|0|0|SEARCH TABLE testUSING INDEX a_i2 (a=?)

加上where a=1之后关键字变成了SEARCH,表示不再需要遍历了,而是使用了索引进行了部分检索,另外这条输出还有更多信息,比如使用了索引a_i2,而括号里面的a=?则表示是这个查询条件引起的我们稍微修改下SQL:

sqlite> explain QUERY PLAN select a from table1 where a=1;

0|0|0|SEARCH TABLE table1 USING COVERING INDEX a_i (a=?)

把select 变成了select a,发现explain输出有细微变化,从INDEX变成了COVERING INDEX,CONVERING INDEX表示直接使用索引查询就可以得到结果,不需要再次回查数据表,这样效率更高。而之前的查询因为是使用,索引里面只有a记录,所以必须要查询原始记录才能得到b,c字段。

三、性能优化的对比


1、这里我专门来测试一下getColumnIndex的速度问题

查询一条数据

在这里插入图片描述

查询一条信息的数据,调用到经过测试,输出的时间为43毫秒。

之后写上另个方法:把显示列前面定义出来,然后直接取列的序号

在这里插入图片描述

按照这样的方法查询一条信息的数据,调用到经过测试,输出的时间为42毫秒。与上面的基本没有什么变化。接下来我们进行查询多条数据的对比:

查询多条数据

第一个是使用了getcolumnindex方法的查询:

在这里插入图片描述

执行查询过程,调用到经过测试,输出的时间为11366毫秒.

之后是将getcolumnindex方法去掉之后进行测试:

在这里插入图片描述

执行查询过程,调用到经过测试,输出的时间为10368毫秒.

结论

当我们在查询一条语句的时候,用getcolumnindex获取到对应列和直接取列的序号几乎没有影响。当我们查询很多数据的时候,会有一些变化,但是可能影响的也不算太大,不过有节省就算了一个优化了,还是建议我们在写的时候尽量少用到cursor.getcolumnindex方法。

2、利用android提高的的insert,query,update,deleteAPI与execSql,rawQuery函数执行原生的插入,查询,更新,删除语句操作花费时间的对比结果

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

…(img-oLx1myPO-1710919924861)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-3uliQJTa-1710919924861)]

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值