知其然要知其所以然,探索每一个知识点背后的意义,你知道的越多,你不知道的越多,一起学习,一起进步,如果文章感觉对您有用的话,关注、收藏、点赞,有困惑的地方可以评论,我们一起探讨!
1. 何时适合用 ES 替代/补充 MySQL 分表?
典型场景
- 全文搜索需求:
如商品描述模糊匹配、日志关键词检索等,ES 的倒排索引性能远超 MySQL 的LIKE。 - 聚合分析:
实时统计(如用户行为分析、大盘报表),ES 的聚合计算能力比 MySQL 更高效。 - 高并发读:
如电商商品列表页(过滤+排序),ES 的分布式架构可轻松横向扩展。 - 非强一致性场景:
ES 数据同步有秒级延迟,适合允许短暂不一致的业务(如搜索、推荐)。
不适用的场景
- 强事务需求:如订单支付、账户余额操作(需保持 MySQL 的 ACID 特性)。
- 低频冷数据:无查询需求的历史数据,存储到 ES 会浪费资源。
2. ES 与 MySQL 的协作模式
(1)主从架构(读写分离)
- 写入:数据仍写入 MySQL(保证事务和强一致性)。
- 同步:通过 Binlog 监听(如 Canal) 或 ETL 工具(如 Logstash) 异步同步到 ES。
- 查询:复杂查询走 ES,简单事务查询走 MySQL。
(2)冷热分离
- 热数据:近期高频访问数据存入 ES,提升查询速度。
- 冷数据:历史数据归档到 MySQL 或对象存储(如 S3)。
(3)混合分表+ES
- MySQL 按业务分表(如按用户 ID 分 100 张表),同时将分表数据同步到 ES,利用 ES 做全局检索。
3. ES 替代分表的优势
| 维度 | MySQL 分表 | Elasticsearch |
|---|---|---|
| 查询灵活性 | 需预先设计分表键,跨表查询复杂 | 支持任意字段组合查询、全文检索 |
| 扩展性 | 分表后再次扩容需迁移数据(如从 16 到 32 表) | 动态增加节点,分片自动重平衡 |
| 写入性能 | 单机写入受硬件限制 | 分布式写入,吞吐量更高 |
| 运维成本 | 需管理多表,跨表查询逻辑复杂 | 集群化运维,但需熟悉 ES 生态工具 |
4. 使用 ES 的注意事项
(1)数据同步延迟
- 异步同步:ES 数据比 MySQL 延迟几秒到几分钟,需业务容忍。
- 解决方案:关键操作(如商品详情页)回查 MySQL,非关键操作(如列表页)走 ES。
(2)资源消耗
- 内存:ES 依赖 JVM Heap,数据量大时内存消耗较高。
- 存储:ES 默认创建副本,存储空间是 MySQL 的 2~3 倍。
(3)数据建模差异
- Schema 设计:ES 使用动态 Mapping,但需预先定义分词器(如 ik)、字段类型。
- 关联查询:ES 不支持 Join,需通过 Nested 或 Parent-Child 结构模拟,性能较差。
5. 示例:电商系统改造
- 原始架构:
MySQL 商品表单表 5000 万行,商品搜索用LIKE,响应时间 >2s。 - 改造后:
- MySQL 保留商品基础信息(SKU、价格、库存),保证事务更新。
- 通过 Logstash 将商品数据同步到 ES,存储标题、描述、标签等搜索字段。
- 前端搜索请求全部转发到 ES,响应时间 <100ms。
6. 决策建议
- 优先优化 MySQL:如果查询模式简单(如按主键查),先尝试分表或分区。
- 引入 ES 的场景:
- 存在
LIKE '%keyword%'、多字段过滤排序、聚合统计。 - 查询 QPS 高(如 >1000),且 MySQL 无法通过扩容解决。
- 存在
- 混合架构:多数系统适合 MySQL + ES 组合,而非完全替代。
总结
将数据同步到 ES 是解决 MySQL 单表性能瓶颈的重要补充方案,尤其适合搜索和分析场景。但需评估同步延迟、资源成本、数据一致性要求。实际架构中,通常采用 MySQL 处理事务 + ES 处理查询 的混合模式,而非二选一。