数据库中的数据量猛增,访问性能也变慢了,优化迫在眉睫 ?
- 关系型数据库本身比较容易成为系统瓶颈:单机存储容量、数据库连接数、处理能力都有限。
- 当单表的数据量达到 1000W 或 100G 以后,由于查询维度较多,即使做了优化索引等操作, 查询性能
仍下降严重。
方案 1 :
通过提升服务器硬件能力来提高数据处理能力,比如增加存储容量 、 CPU 等,这种方案成本很高,并且
如果瓶颈在 MySQL 本身那么提高硬件也是有很的。
方案 2 :
把数据分散在不同的数据库中,使得单一数据库的数据量变小来缓解单一数据库的性能问题,从而达到
提升数据库性能的目的;
分库分表概述
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题 ;
- 将原来独立的数据库拆分成若干数据库组成 ;
- 将原来的大表 ( 存储近千万数据的表 ) 拆分成若干个小表;
目的:使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
数据库拆分策略
- 垂直分割
垂直分割是将一个表按照列的方式拆分成多个表,减少单个表的记录数和列数,提高查询性能。垂直分割一般
分为两种: 基于功能分割和基于范式分割。例如,将一个用户表拆分为登录信息表、用户信息表和账户信息
表。- 水平分割
水平分割是将一个表按照行的方式拆分成多个表,将数据存储到多个服务器上,提高查询性能。水平分割一般
按照主键或按照特定的列进行分割。例如,将一个订单表按照订单号拆分成多个表。- 读写分离
读写分离是将对数据库的读操作和写操作拆分到不同的服务器上,减轻单个数据库的负载压力,提高查询性
能。例如,将一个电商网站的读取操作分配到从数据库上,将写操作分配到主数据库上。- 分片
分片是将一个大型数据表按照某个维度拆分成多个小的数据表,并将数据存储到多个服务器上。分片一般按照
分片键进行分割,例如,将一个电商网站的订单表按照某个地理位置分割成多个子表。
本机安装多个 mysql
复制 mysql 安装目录下文件夹到某盘
修改 D 盘 mysql 中 my.ini 文件
[mysqld]
port = 3333
character_set_server = utf8
basedir = D : \mysql-5.7.25-winx64\3333\mysql-5.7.25-winx64
datadir = D : \mysql-5.7.25-winx64\3333\mysql-5.7.25-winx64\data
server-id = 101
sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names = 1
innodb_file_per_table = 1
log_timestamps = SYSTEM
ngram_token_size = 1
log-error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
long_query_time = 5
binlog_format = row
expire_logs_days = 15
log_bin_trust_function_creators = 1
log-bin = D : \mysql-5.7.25-winx64\log\mysql-bin
binlog-do-db = smbms
[client]
default-character-set = utf8
输入 cmd ,以管理员身份运行 dos
输入命令创建第二个 mysql 服务
mysqld install MySQL3333 --defaults-file="D:\mysql-5.7.25-winx64\3333\mysql-5.7.25-
winx64\my.ini"
删除服务命令:
mysqld - remove 服务名
查看服务是否安装,修改注册表中信息
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL2
下 ImagePath 变量值: "E:\MySQL Server 5.5\bin\mysqld" --defaults-file="E:\MySQL Server
5.5\my.ini"
启动两个服务
第二个服务默认 mysql 没有密码,可以连接试试
使用 dos 命令登录第二个服务修改密码
mysql - uroot - p - P3307 (按下回车,让你输入密码,在按回车,密码可以不用输入)
use mysql; 切换数据库
update user set password=password('root') where user='root' and host='localhost' ;
flush privileges ;
quit ; 退出后再次使用密码登录
show global variables like 'port' ; 查看当前数据库端口号
MYSQL****实现读写分离
3333 为主, 3334 为从
修改 3333 中 my.ini 文件信息
添加如下代码
log-bin=D:\mysql-5.7.25-winx64\log\mysql-bin
binlog-do-db=smbms
[mysqld]
port = 3333
character_set_server = utf8
basedir = D : \mysql-5.7.25-winx64\3333\mysql-5.7.25-winx64
datadir = D : \mysql-5.7.25-winx64\3333\mysql-5.7.25-winx64\data
server-id = 101
sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names = 1
innodb_file_per_table = 1
log_timestamps = SYSTEM
ngram_token_size = 1
log-error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
long_query_time = 5
binlog_format = row
expire_logs_days = 15
log_bin_trust_function_creators = 1
log-bin = D : \mysql-5.7.25-winx64\log\mysql-bin
binlog-do-db = smbms
[client]
default-character-set = utf8
重启服务并输入命令查看日志信息
show master status;
000002 最新的版本信息
位置默认到 563
注意:可以另外在创建一个新的用户以供连接使用,此处我使用 root
修改 3334 中的 my.ini 文件
添加如下代码
log-bin = D : \mysql-5.7.25-winx64\log\mysql-bin
replicate-do-db = smbms
log-slave-updates
使用dos命令进入3334数据库,并进行信息绑定
mysql -uroot -p -P3334
stop slave;127.0.0.1 为主数据库 IP 3333 为主数据库端口 用户,密码为主数据库 000002 要与主数据库 log 版本
相同 563 也一样
change master to
master_host='127.0.0.1',master_port=3333,master_user='root',master_password='roo
t',master_log_file='mysqld-bin.000002',master_log_pos= 563;
start slave;
show slave status\G; # 查看是否连接
如果失败,尝试修改uuid
ShardingSphere****简介
Apache ShardingSphere 是一款开源的分布式数据库中间件组成的生态圈,它由 Sharding
JDBC 、 Sharding-Proxy 和 Sharding-Sidecar (规划中)这 3 款相互独立的产品组成。
ShardingSphere 定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据
库的 计算和存储能力,而并非实现一个全新的关系型数据库。
1 ) Sharding-JDBC :被定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务,以 jar 包形式使用。
2 ) Sharding-Proxy :被定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版 本,
用于完成对异构语言的支持。
3 ) Sharding-Sidecar :被定位为 Kubernetes 或 Mesos 的云原生数据库代理,以 DaemonSet 的形式代
理所有对数据库的访问。
ShardingSphere-JDBC
ShardingSphere-JDBC 是 ShardingSphere 的第一个产品,也是 ShardingSphere 的前身, 我们经常
简称之为: sharding-jdbc 。 它定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用
客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完
全兼容 JDBC 和各种 ORM 框架。
适用于任何基于 Java 的 ORM 框架,如: JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用
JDBC 。
基于任何第三方的数据库连接池,如: DBCP, C3P0, BoneCP, Druid, HikariCP 等。
支持任意实现 JDBC 规范的数据库。目前支持 MySQL , Oracle , SQLServer 和 PostgreSQL 。
sharding-jdbc的本质上就是实现JDBC****的核心接口。
ShardingSphere-JDBC+mybatisplus
读写分离(水平拆分)
3333 中 smbms 为主库, 3334 中 smbms 为从库
2 个库中都需同时存在 smbms_user 表,要求结构相同
1.引入jar包
XML
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!--阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
编写yml文件(注意缩进)
分库分表(水平拆分)
分表:在同一数据库下创建两张订单表,要求结构相同,让 id 为奇数数据放入 smbms_bill_1 中 ,id 为偶数
数据放入 smbms_bill_2 中,分开存储数据,查询是合并在一起。
分库分表:在 3333 与 3334 下创建 smbms02 数据库,在 3333 下创建 smbms_bill_1 ,在 3334 下创建
smbms_bill_2
读写分离**+**分库分表(水平拆分
创建数据库 smbms01 与 smbms02
分别在 smbms01 与 02 中创建表 smbms_user,smbms_bill_1,smbms_bill_2
分库分表(垂直拆分)
分别创建数据库 smbms01 与 smbms02
smbms01 中创建表 smbms_user
smbms02 中创建表 smbms_bill( 订单表 )