
1) 【一句话结论】
移动端本地数据库性能优化需通过缓存策略(LRU/TTL)、索引优化、数据分片,针对性减少I/O操作,提升查询与写入效率,需根据数据特性选择组合策略。
2) 【原理/概念讲解】
老师口吻解释核心概念:
user_id=1时,索引能直接找到对应行,而不用扫描整张表。3) 【对比与适用场景】
| 策略/技术 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| LRU缓存 | 最近最少使用 | 自动淘汰最久未使用项 | 高频查询但数据量大的场景(如用户常用配置) | 需实现LRU算法,可能存在缓存击穿风险 |
| TTL缓存 | 生存时间 | 数据过期后自动失效 | 数据时效性要求高的场景(如价格、新闻) | 需设置合理TTL,避免过期频繁导致数据库查询 |
| 索引优化 | 为表创建索引 | 加速数据检索,减少全表扫描 | 查询条件中频繁出现的列(如用户ID、时间戳) | 索引会增加写操作开销,需权衡 |
| 数据分片 | 按规则拆分数据 | 减少单表数据量,提升查询效率 | 大数据量场景(如用户历史记录、日志) | 分片后需处理跨分片查询,可能增加复杂度 |
4) 【示例】
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列建索引
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) 【追问清单】
user_id和create_time,创建复合索引(user_id, create_time)。7) 【常见坑/雷区】