在 MySQL 单表存储 500 万数据的场景下,如何设计读取
在 MySQL 单表存储 500 万数据的场景下,设计高效读取方案需要从 查询优化、架构扩展、硬件调优 三个层面综合考虑。以下是具体方案,结合实际项目经验(如标易行投标服务平台)进行分析:
一、查询优化:降低单次查询开销
1. 索引优化
- 核心原则:仅为高频查询条件、排序字段、分组字段建立索引,避免过度索引。
- 场景示例:
- 标易行平台的“商机检索”功能,用户按行业、地区、发布时间组合筛选,建立联合索引
(industry, region, publish_time)
。 - 对“我的收藏”列表按用户 ID 分页查询,建立
(user_id, created_time)
索引,避免全表扫描。
- 标易行平台的“商机检索”功能,用户按行业、地区、发布时间组合筛选,建立联合索引
- 优化技巧:
- 使用
覆盖索引
(索引包含查询字段)减少回表操作。 - 避免索引字段参与计算(如
WHERE YEAR(create_time) = 2024
→ 改写为范围查询)。
- 使用
2. 分页优化
- 问题:
LIMIT 1000000, 20
会扫描前 100 万行,性能极差。 - 解决方案:
- 游标分页:记录上一页最后一条数据的 ID(或时间戳),下一页查询使用
WHERE id > last_id LIMIT 20
。SELECT * FROM tender WHERE
- 游标分页:记录上一页最后一条数据的 ID(或时间戳),下一页查询使用