MySQL 中大数据量高访问量的表负载分担策略

这篇文章承接上文 MySQL 分区表性能测试。本来想着通过分区表来解决大数据量场景下(千万级)有可能的慢查询问题,实际证明只要索引建好,5000 万查询性能也没有多少影响。但是在 Keeper 调度工具中,任务实例表是非常关键的表,又是查询非常多的表,且查询方式多样。不改分区,为了应对将来有可能发生的查询问题,又不能什么都不做。

主要优化思路如下:

  1. 统计所有的查询条件。
  2. 分析有可能存在的问题。
  3. 冗余式拆表,分散查询压力。
  4. 优化索引。
  5. 修改代码。

统计所有的查询条件

通过全局查找,涉及到两个项目。与任务实例表qross_tasks相关的查询共有169个,涉及到字段共9个。这次整理完了,才发现自己之前写 SQL 语句真是随心所欲。因为项目周期跨了几年,WHERE 条件中各种写法都有,很多时候都没有考虑性能问题,只是实现了逻辑就好了,觉得该建索引了,就加一个,这 9 个字段一共建了8个索引,也没考虑索引建的合适不合适,鄙视自己一下。

与查询相关的字段有:

分析有可能存在的问题

不再考虑已经建好的索引是否合适,重新分析查询条件,再为这些条件重新确定怎么建索引。

解决

经过分析和思考,最终有了解决方案。

总结

这个优化思路并不是常用的拆表或建分区的优化方式,主要还是分析查询条件、根据查询条件建立不同的冗余表。优点是可以极大的提高查询效率,缺点是数据冗余必然会增大“增删改”的复杂度。

优化后的数据表结构如下:


参考链接


微信公众号
码农老吴  |  星源工作室  |  开发月志  |  问题反馈
联系我们:wu@qross.io     手机/微信:18618171102
京 ICP 备 20027445 号
$(h1)!