本文主要总结MYSQL使用过程中的一些优化点,避免性能瓶颈
数据库连接池
减少频繁创建数据库连接带来的性能损耗。
池化技术:空间换时间,期望使用预先创建好的对象来减少频繁创建对象的性能开销,同时还可以对对象进行统一的管理,降低了对象的使用的成本。
JAVA线程池云源码参考:并发-AQS之ThreadPoolExecutor源码解读(一)
数据连接池常用工具:
MYSQL系列-数据库连接池:HikariCP介绍和使用
MYSQL系列-数据库连接池:Druid介绍和使用
主从分离
读远大于写,读的实时性要求不高,利用从库进行读操作,属于数据库横向扩展
MYSQL主从复制原理:
从库不能无限制增加:随着从库的增加,主库需要创建同样多的log dump线程处理请求,会对主库的资源尤其是CPU和宽带消耗较高,一般主库最多挂
3-5从库。
主从分离带来的问题:主从延迟 使用从库查询时考虑主从延迟对业务是否有影响,如不能主从延迟,可从下面三个方面着手:
- 数据冗余 不需要从从库查询
- 使用缓存 短期缓存,也是为了不从从库查询
- 查询主库 考虑主库是否能承受住压力
主从分离方案实现:
- 客户端代理:sharding-jdbc或者spring动态数据源
- 独立部署代理服务器:mycat
分库分表
垂直拆分:
数据库竖着拆分,也就是将数据库的表拆分到多个不同的数据库中。
垂直拆分的原则一般是按照业务类型来拆分,核心思想是专库专用,将业务耦合度比较高的表拆分到单独的库中。关注点在于业务相关性
水平拆分:
将单一数据表按照某一种规则拆分到多个数据库和多个数据表中,关注点在数据的特点。
选中好分区键,数据库SQL操作需要带上分区键,避免全表查询
水平拆分带来的问题:
- 无法使用分区键查询的,需要全表扫描
- 可以建一个对应字段与分区键的映射,进行二次查询
- 无法使用一些复杂的SQL,比如JOIN和总数查询等
- 针对join,可以把多个表数据查询出来,在业务应用中做筛选
- 针对查询总数,可以依次在分库分表中查询后汇总