高并发系统-MYSQL数据库优化

218 阅读2分钟

本文主要总结MYSQL使用过程中的一些优化点,避免性能瓶颈

数据库连接池

减少频繁创建数据库连接带来的性能损耗。

池化技术空间换时间,期望使用预先创建好的对象来减少频繁创建对象的性能开销,同时还可以对对象进行统一的管理,降低了对象的使用的成本。

JAVA线程池云源码参考:并发-AQS之ThreadPoolExecutor源码解读(一)

数据连接池常用工具:
MYSQL系列-数据库连接池:HikariCP介绍和使用
MYSQL系列-数据库连接池:Druid介绍和使用

主从分离

远大于,读的实时性要求不高,利用从库进行读操作,属于数据库横向扩展

MYSQL主从复制原理:

image.png 从库不能无限制增加:随着从库的增加,主库需要创建同样多的log dump线程处理请求,会对主库的资源尤其是CPU和宽带消耗较高,一般主库最多挂3-5从库。

主从分离带来的问题:主从延迟 使用从库查询时考虑主从延迟对业务是否有影响,如不能主从延迟,可从下面三个方面着手:

  1. 数据冗余 不需要从从库查询
  2. 使用缓存 短期缓存,也是为了不从从库查询
  3. 查询主库 考虑主库是否能承受住压力

主从分离方案实现:

  • 客户端代理:sharding-jdbc或者spring动态数据源
  • 独立部署代理服务器:mycat

分库分表

垂直拆分:
数据库竖着拆分,也就是将数据库的表拆分到多个不同的数据库中。
垂直拆分的原则一般是按照业务类型来拆分,核心思想是专库专用,将业务耦合度比较高的表拆分到单独的库中。关注点在于业务相关性

水平拆分
将单一数据表按照某一种规则拆分到多个数据库和多个数据表中,关注点在数据的特点。

选中好分区键,数据库SQL操作需要带上分区键,避免全表查询

水平拆分带来的问题:

  1. 无法使用分区键查询的,需要全表扫描
    • 可以建一个对应字段与分区键的映射,进行二次查询
  2. 无法使用一些复杂的SQL,比如JOIN和总数查询等
    • 针对join,可以把多个表数据查询出来,在业务应用中做筛选
    • 针对查询总数,可以依次在分库分表中查询后汇总