SQLite 在大量数据的情况下如何优化查询? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ysy950803
V2EX    Android

SQLite 在大量数据的情况下如何优化查询?

  •  1
     
  •   ysy950803 2024-11-06 17:49:04 +08:00 6721 次点击
    这是一个创建于 397 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近遇到移动端数据库的性能瓶颈问题了。

    我们的应用主要依赖于谷歌官方的 Room 框架,用了 Kotlin 的 Flow 来实现响应式数据流,由于项目比较新,各种依赖库都是最新的。

    有用户积累了 2 万多条数据,在中低端手机上,查一次要好几秒,由于建立了数据库索引,插入的速度也很慢,一条数据也要等好多秒。应用有查全部数据的需求(包括一些全局统计信息等等),所以不想每次用户查全部数据都加 loading 之类的弹窗,体验会很不好。

    是否有办法优化 SQLite 数据库的读写速度呢?感觉依赖于 Room 后,开发者能做的很少。

    16 条回复    2024-11-15 17:49:07 +08:00
    jstony
        1
    jstony  
       2024-11-06 17:50:19 +08:00
    sqlite 处理 2 万条数据应该是小 case 吧,会不会瓶颈不在数据库这里?
    ltmst
        2
    ltmst  
       2024-11-06 17:53:32 +08:00
    2w 条对 sqlite 小意思了,应该是业务或者操作的问题
    我印象中批量写的时候,一定要用事务操作,同一个事务只有一次 io
    NoOneNoBody
        3
    NoOneNoBody  
       2024-11-06 18:18:13 +08:00
    插入为什么要等?插入不影响后续工作啊
    iyiluo
        4
    iyiluo  
       2024-11-06 18:21:29 +08:00
    才 2w 条,怎么可能瓶颈了,微信用的也是 SQLite ,十几 G 的数据查起来挺快的
    caola
        5
    caola  
       2024-11-06 19:32:31 +08:00
    不太可能是 sqlite 问题。多进程读取是没问题,但多进程写入之前有其他的操作没有释放就会导致问题
    ursash
        6
    ursash  
       2024-11-06 21:26:59 +08:00
    ducked?
    ursash
        7
    ursash  
       2024-11-06 21:27:50 +08:00
    打错了。。duckdb
    icy37785
        8
    icy37785  
       2024-11-07 01:49:22 +08:00 via iPhone
    才两万条数据,离 sqlite 的瓶颈差的远。感觉你应该在其他地方找问题。
    iX8NEGGn
        9
    iX8NEGGn  
       2024-11-07 03:35:17 +08:00 via iPhone
    sqlite 强得很,有索引两亿条都不至于几秒,找找别的原因
    gogogo2000
        10
    gogogo2000  
       2024-11-07 09:20:21 +08:00
    sqlite 的性能在有索引的情况下,最少也要百万级别才能感受到性能衰减,你这个 2w 根本不值一提
    ysy950803
        11
    ysy950803  
    OP
       2024-11-07 11:54:12 +08:00
    @NoOneNoBody 考虑过放到后台去执行,但是怕用户杀进程,插入就会失败。
    ysy950803
        12
    ysy950803  
    OP
       2024-11-07 11:56:50 +08:00
    谢谢大家回复,确实单纯从查询来看,查全表耗时在 1s 内,但是我们数据遍历处理又花了一两秒,所以每次用户在 UI 上切换“非全部(比如某年某月)”和“全部”数据时,还是能感觉到明显的等待过程,数据不能立即渲染到 UI 上。
    815979670
        13
    815979670  
       2024-11-07 15:00:48 +08:00
    SQlite 性能很快的 @ysy950803 看了 12 楼的回复 可以考虑将一部分处理的逻辑放到 SQLite 查询时处理 应该能节省遍历的过程?
    shyangs
        14
    shyangs  
       2024-11-07 17:16:30 +08:00
    「全部」料直接 cache 第一,非全部(某年某月)切回「全部」是 cache 或捉出,而不是低端的 emmc 出.
    zhanlanhuizhang
        15
    zhanlanhuizhang  
       224-11-08 16:05:57 +08:00
    2 万数据,应该不是 sqlite 的问题。我公司的应用,500 百万的数据,查询都很快。
    ysy950803
        16
    ysy950803  
    OP
       2024-11-15 17:49:07 +08:00
    @shyangs 是的,现在做了分页。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5714 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 06:21 PVG 14:21 LAX 22:21 JFK 01:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86