51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在移动端应用中,如何优化本地数据库(如SQLite或Core Data)的性能?请说明缓存策略(如LRU缓存、TTL)、索引优化以及数据分片的方法。

Tencent软件开发-移动客户端开发方向难度:中等

答案

1) 【一句话结论】
移动端本地数据库性能优化需通过缓存策略(LRU/TTL)、索引优化、数据分片,针对性减少I/O操作,提升查询与写入效率,需根据数据特性选择组合策略。

2) 【原理/概念讲解】
老师口吻解释核心概念:

  • 缓存策略:
    • LRU(Least Recently Used,最近最少使用):缓存中维护一个队列,最近访问的放在队列头,最久未访问的放在队列尾,缓存满时淘汰队列尾项。类比:浏览器缓存,你最近打开的网页保留,不常用的(如一个月未访问的)被清理。
    • TTL(Time To Live,生存时间):为缓存数据设置过期时间,过期后自动失效,需重新从数据库查询。类比:新闻APP里的新闻,设置24小时过期,超过24小时自动更新。
  • 索引优化:数据库表中的索引类似“书的目录”,通过索引可快速定位数据,避免全表扫描。比如查询user_id=1时,索引能直接找到对应行,而不用扫描整张表。
  • 数据分片:将大表按规则拆分成多个小表(如按时间、用户ID分表),减少单表数据量,提升查询性能。类比:图书馆的书按分类(历史、文学)分到不同书架,找书更快。

3) 【对比与适用场景】

策略/技术定义特性使用场景注意点
LRU缓存最近最少使用自动淘汰最久未使用项高频查询但数据量大的场景(如用户常用配置)需实现LRU算法,可能存在缓存击穿风险
TTL缓存生存时间数据过期后自动失效数据时效性要求高的场景(如价格、新闻)需设置合理TTL,避免过期频繁导致数据库查询
索引优化为表创建索引加速数据检索,减少全表扫描查询条件中频繁出现的列(如用户ID、时间戳)索引会增加写操作开销,需权衡
数据分片按规则拆分数据减少单表数据量,提升查询效率大数据量场景(如用户历史记录、日志)分片后需处理跨分片查询,可能增加复杂度

4) 【示例】

  • 索引创建(SQLite):
    CREATE TABLE user_table (
        user_id INTEGER PRIMARY KEY,
        username TEXT,
        last_login TIMESTAMP
    );
    CREATE INDEX idx_user_id ON user_table (user_id);  -- 为user_id列建索引
    
  • 缓存策略伪代码(LRU+TTL):
    class LRUCache:
        def __init__(self, max_size):
            self.cache = {}
            self.queue = []
            self.max_size = max_size
    
    class TTLCache:
        def __init__(self, max_ttl):
            self.cache = {}
            self.max_ttl = max_ttl
    
    def get_user_data(user_id):
        if LRU_CACHE.get(user_id):
            return LRU_CACHE.get(user_id)
        elif TTL_CACHE.get(user_id) and is_valid(TTL_CACHE.get(user_id)):
            return TTL_CACHE.get(user_id)
        else:
            data = query_db("SELECT * FROM user_table WHERE user_id = ?", [user_id])
            LRU_CACHE.put(user_id, data)
            TTL_CACHE.put(user_id, data, ttl=3600)  # 1小时过期
            return data
    

5) 【面试口播版答案】
“面试官您好,移动端本地数据库性能优化核心是通过缓存、索引、分片三方面减少I/O操作。首先,缓存策略:高频但变化小的数据用LRU(最近最少使用),比如用户常用配置,缓存减少数据库查询;时效性数据用TTL(生存时间),比如价格、新闻,设置过期时间后自动失效。然后索引优化:为查询条件列建索引,比如用户ID、时间戳,避免全表扫描,提升查询速度。数据分片则是将大数据量按规则拆分,比如按时间分表,减少单表数据量,比如用户历史记录按月分表,查询当月数据时只扫描对应分表。综合来看,需根据数据特性选择策略,比如高频静态数据用LRU,时效数据用TTL,查询频繁列建索引,大数据量分片。”

6) 【追问清单】

  1. 如何实现LRU缓存?
    回答:用链表维护访问顺序,哈希表快速查找,淘汰时移除链表尾部。
  2. 索引优化中,复合索引如何选择?
    回答:根据查询条件组合,比如查询user_id和create_time,创建复合索引(user_id, create_time)。
  3. 数据分片后,如何处理跨分片查询?
    回答:根据分片键路由,比如时间分片用时间戳计算分片,查询时指定分片范围。
  4. 缓存击穿如何处理?
    回答:设置默认值或空数据,避免缓存空导致所有请求都查数据库。
  5. SQLite和Core Data的优化差异?
    回答:SQLite更灵活,需手动管理索引、事务;Core Data有对象管理,但需注意对象图优化。

7) 【常见坑/雷区】

  1. 缓存失效导致数据不一致:TTL设置过短或过长,导致缓存与数据库数据不同步。
  2. 索引过多导致写性能下降:为每个列建索引,增加插入、更新开销。
  3. 数据分片导致查询复杂:分片键选择不当,跨分片查询效率低。
  4. 缓存策略选择错误:高频变化数据用LRU,反而频繁淘汰影响性能。
  5. 未考虑移动端网络延迟:缓存策略未结合网络状况,离线时优先用缓存,在线时同步。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1