MySQL 全文检索性能优化:LIKE 查询拖慢主库?Canal 同步 ES + 增量实时更新!
公司的后台管理有一个搜索功能,搜订单备注里的关键词。刚开始数据量小,MySQL 的 LIKE '%keyword%' 还能跑。后来订单涨到几百万条,一个模糊搜索要跑 8 秒。更倒霉的是,这个搜索请求直接打在主库上——索引走不了,全表扫描,CPU 飙到 90%,其他正常业务也跟着慢。 LIKE '%xxx%' 是数据库的噩梦。前导通配符导致索引完全失效,只能全表扫描。MySQL 虽然也有 FULLTEXT 索引,但中文分词烂、不支持复杂排序、而且仍然在主库上消耗资源。 今天聊聊怎么用 Canal 把 MySQL 的数据实时同步到 Elasticsearch,把搜索的活从主库彻底拆出来。 架构:主库只管写,搜索交给 ES MySQL(主库) Elasticsearch │ │ │ INSERT/UPDATE/DELETE │ ├──── Canal 监听 binlog ──────────→├─ 增量同步 │ │ │ 业务读写 │ 全文搜索 │ (走主库) │ (走 ES) Canal 伪装成 MySQL 的 Slave,订阅 binlog 的变更事件。任何 INSERT、UPDAT....