Skip to content

为什么要使用ES,MySQL不能解决问题吗?

为什么要使用 ES

  • 核心原因
  • Elasticsearch 专为全文搜索、复杂查询和高并发分析设计,提供高效的倒排索引和分布式架构,适合实时搜索和日志分析。
  • MySQL 的局限
  • MySQL 是关系型数据库,擅长结构化数据存储和事务处理,但在全文搜索、大规模数据分析和模糊匹配上性能较差。

具体原因

  1. 全文搜索效率:ES 基于倒排索引,搜索快;MySQL 用 LIKE 或全文索引慢。
  2. 分布式扩展:ES 天生分布式,横向扩展;MySQL 分库分表复杂。
  3. 复杂查询:ES 支持多条件、模糊查询;MySQL 查询复杂时性能下降。
  4. 实时性:ES 近实时(NRT);MySQL 索引更新慢。
  5. 分析能力:ES 擅长聚合统计;MySQL 聚合查询资源密集。

核心点

  • ES 补足 MySQL 在搜索和分析上的短板。

1. ES 与 MySQL 对比详解

(1) 全文搜索效率

  • ES
  • 使用倒排索引,快速定位关键词。
  • 分词支持(如中文 ik 分词器),模糊匹配强。
  • 示例:搜索“手机”匹配“智能手机”。
  • MySQL
  • LIKE '%phone%':全表扫描,慢。
  • 全文索引(InnoDB 5.6+):
    • 仅支持简单词匹配,分词弱。
    • 性能远逊于 ES。
  • 结论
  • ES 搜索速度快数倍,适合复杂搜索。

(2) 分布式扩展

  • ES
  • 天生分布式,分片和副本自动管理。
  • 横向扩展:加节点即可。
  • 示例:日志系统扩展到 PB 级。
  • MySQL
  • 单机为主,分库分表需手动设计。
  • 主从复制延迟,扩展复杂。
  • 结论
  • ES 适合大数据量和高并发。

(3) 复杂查询

  • ES
  • 支持布尔查询、范围查询、聚合等。
  • 示例:
GET /products/_search
{
  "query": {
    "bool": {
      "must": { "match": { "name": "phone" } },
      "filter": { "range": { "price": { "lte": 1000 } } }
    }
  }
}
  • MySQL
  • 复杂 JOIN、子查询性能差。
  • 示例:
SELECT * FROM products WHERE name LIKE '%phone%' AND price <= 1000;
  • 大表 JOIN 易卡顿。
  • 结论
  • ES 查询灵活,响应快。

(4) 实时性

  • ES
  • 近实时(NRT),写入后 1 秒可搜。
  • 刷新间隔可调(index.refresh_interval)。
  • MySQL
  • 索引更新(B+ 树)同步,延迟高。
  • 大量写入影响查询。
  • 结论
  • ES 适合动态数据场景。

(5) 分析能力

  • ES
  • 内置聚合(如 sumavg),支持实时统计。
  • 示例:
GET /logs/_search
{
  "aggs": {
    "by_status": { "terms": { "field": "status" } }
  }
}
  • MySQL
  • 聚合查询扫描全表,慢且耗资源。
  • 示例:
SELECT status, COUNT(*) FROM logs GROUP BY status;
  • 结论
  • ES 分析效率高,适合日志和 BI。

2. MySQL 不能解决的问题

(1) 全文搜索性能

  • 问题
  • LIKE 或全文索引无法处理复杂分词和模糊匹配。
  • 例:搜索“苹果手机”匹配“iPhone”。
  • ES 优势
  • 分词器精确拆分,BM25 排序相关性高。

(2) 大规模数据

  • 问题
  • MySQL 单表超千万行,查询变慢。
  • 分库分表维护成本高。
  • ES 优势
  • 分片分布式存储,查询并行。

(3) 高并发实时查询

  • 问题
  • MySQL 高并发下锁冲突,响应延迟。
  • ES 优势
  • 分布式架构,负载均衡。

(4) 非结构化数据

  • 问题
  • MySQL 需定义 Schema,处理 JSON 或日志困难。
  • ES 优势
  • 无 Schema,动态映射。

3. MySQL 的优势(为何不完全替代)

  • 事务支持
  • MySQL 提供 ACID,适合订单、支付。
  • ES 无强一致性事务。
  • 结构化数据
  • MySQL 表结构清晰,适合精确查询。
  • ES 更偏向非结构化。
  • 小规模场景
  • MySQL 单机部署简单,ES 集群复杂。

4. ES 和 MySQL 的结合

  • 模式
  • MySQL 存核心数据,ES 存搜索索引。
  • 数据同步:
    • Logstash:MySQL → ES。
    • Canal:监听 Binlog 更新 ES。
  • 示例
  • 电商:
    • MySQL 存订单。
    • ES 存商品索引,供搜索。

5. 延伸与面试角度

  • 实际应用
  • 日志:ELK 栈分析服务器日志。
  • 搜索:电商商品模糊查询。
  • 性能对比
  • ES 秒级响应,MySQL 慢查询需优化。
  • 面试点
  • 问“为何用”时,提全文搜索和分布式。
  • 问“结合”时,提同步方案。

总结

ES 因倒排索引、分布式架构和实时分析优于 MySQL 的全文搜索和大数据场景,但 MySQL 更适合事务和结构化数据。两者常结合使用,ES 负责搜索,MySQL 负责存储。面试时,可提应用案例或画架构图,展示理解深度。