MySQL优化是一个程序员的基本素养,每个程序员基本上都具备,但是,越是简单常见的东西,越容易忽视。如何写出一个高质量的SQL语句其实是非常重要的。
在渠道端重构中遇到过一下几个慢SQL场景(线上基本情况:订单量700w+)
1)借款查询:借款查询搜索项特别多,仅搜索项就有20+,需要关联五六张表才能满足业务需求,查询效率不高;【单体系统-服务化后,表已经垂直拆分,记录中心维护一张宽表满足需求】
2)数据权限问题:线上营业部大概有700+,当查询者拥有营业部权限特别多时,查询效率进一步下降;【基础服务冗余一张权限表,权限数据由sso服务统一维护】
3) 大分页跳转问题:选择大分页时,性能极具恶化;【优化sql,使用覆盖索引可以解决这一问题】
4) 业务层次优化:为了减小搜索范围,从业务方面去谈,最终确定所有范围查询都带上订单创建时间(默认半年,可以手动扩大)
整体的核心思想:就是让索引生效,否则在大数据量的场景下,查询效率一定比较低。至于什么样的sql不走索引,这个就太多了。实际中可以用explain去分析。
其他更多mysql优化技巧见后续文章

数据量达到百万级以后,就需要思考如何去优化查询效率了,大致有以下思考方面:

  • 优化索引&优化SQL(常规手段,优化策略太多了,可以结合explain+慢sql语句去定位分析问题)
  • 加缓存(数据一致性问题)
  • 读写分离(如果有必要,可以做读写分离,相当于简单的分库)
  • 分区(mysql的分区没有oracle性能好)
  • 分表(垂直拆分和水平拆分,都需要结合业务场景来分析出最合适的拆分策略,拆的不好,反而会起反作用)
  • 分库(暂时未涉及)
  • 换NoSql数据库【需要看业务场景,是否能满足】

其他参考资料