数据库中的数据量猛增,访问性能也变慢了,优化迫在眉睫
?
1.
关系型数据库本身比较容易成为系统瓶颈:单机存储容量、数据库连接数、处理能力都有限。
2.
当单表的数据量达到
1000W
或
100G
以后,由于查询维度较多,即使做了优化索引等操作, 查询性能
仍下降严重。
方案
1
:
通过提升服务器硬件能力来提高数据处理能力,比如增加存储容量 、
CPU
等,这种方案成本很高,并且
如果瓶颈在
MySQL
本身那么提高硬件也是有很的。
方案
2
:
把数据分散在不同的数据库中,使得单一数据库的数据量变小来缓解单一数据库的性能问题,从而达到
提升数据库性能的目的;
分库分表概述
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题
;
1.
将原来独立的数据库拆分成若干数据库组成
;
2.
将原来的大表
(
存储近千万数据的表
)
拆分成若干个小表;
目的:使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
数据库拆分策略
1. 垂直分割垂直分割是将一个表按照列的方式拆分成多个表,减少单个表的记录数和列数,提高查询性能。垂直分割一般分为两种: 基于功能分割和基于范式分割。例如,将一个用户表拆分为登录信息表、用户信息表和账户信息表。2. 水平分割水平分割是将一个表按照行的方式拆分成多个表,将数据存储到多个服务器上,提高查询性能。水平分割一般按照主键或按照特定的列进行分割。例如,将一个订单表按照订单号拆分成多个表。4. 读写分离读写分离是将对数据库的读操作和写操作拆分到不同的服务器上,减轻单个数据库的负载压力,提高查询性能。例如,将一个电商网站的读取操作分配到从数据库上,将写操作分配到主数据库上。5. 分片分片是将一个大型数据表按照某个维度拆分成多个小的数据表,并将数据存储到多个服务器上。分片一般按照分片键进行分割,例如,将一个电商网站的订单表按照某个地理位置分割成多个子表。
本机安装多个
mysql
复制
mysql
安装目录下文件夹到某盘
修改
D
盘
mysql
中
my.ini
文件
[mysqld]port = 3333character_set_server = utf8basedir = D : \mysql-5.7.25-winx64\3333\mysql-5.7.25-winx64datadir = D : \mysql-5.7.25-winx64\3333\mysql-5.7.25-winx64\dataserver-id = 101sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONlower_case_table_names = 1innodb_file_per_table = 1log_timestamps = SYSTEMngram_token_size = 1log-error = error.logslow_query_log = 1slow_query_log_file = slow.loglong_query_time = 5binlog_format = rowexpire_logs_days = 15log_bin_trust_function_creators = 1log-bin = D : \mysql-5.7.25-winx64\log\mysql-binbinlog-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 Server5.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 = 3333character_set_server = utf8basedir = D : \mysql-5.7.25-winx64\3333\mysql-5.7.25-winx64datadir = D : \mysql-5.7.25-winx64\3333\mysql-5.7.25-winx64\dataserver-id = 101sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONlower_case_table_names = 1innodb_file_per_table = 1log_timestamps = SYSTEMngram_token_size = 1log-error = error.logslow_query_log = 1slow_query_log_file = slow.loglong_query_time = 5binlog_format = rowexpire_logs_days = 15log_bin_trust_function_creators = 1log-bin = D : \mysql-5.7.25-winx64\log\mysql-binbinlog-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-binreplicate-do-db = smbmslog-slave-updates
使用dos命令进入3334数据库,并进行信息绑定
mysql -uroot -p -P3334stop slave;# 127.0.0.1 为主数据库 IP 3333 为主数据库端口 用户,密码为主数据库 000002 要与主数据库 log 版本相同 563 也一样change master tomaster_host='127.0.0.1',master_port=3333,master_user='root',master_password='root',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包
<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(
订单表
)
