以下是数据库入门与实战进阶的完整指南,涵盖SQL核心语法、分库分表策略、中间件实战及高可用架构搭建,并提供MySQL高可用集群和DBLE中间件的完整案例:
一、SQL核心语法与实战
1. 基础操作
sql
-- 创建带约束的用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) CHECK (email LIKE '%@%.%'),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入数据(自动填充主键和时间)
INSERT INTO users (username, email) VALUES
('alice', 'alice@example.com'),
('bob', 'bob@example.com');
-- 查询最近7天注册的用户
SELECT id, username
FROM users
WHERE created_at >= NOW() - INTERVAL 7 DAY
ORDER BY created_at DESC;
2. 进阶查询
sql
-- 分组统计各地区用户数量
SELECT region, COUNT(*) AS user_count
FROM users
GROUP BY region
HAVING user_count > 100;
-- 窗口函数计算用户积分排名
SELECT username, score,
RANK() OVER (ORDER BY score DESC) AS rank,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM user_scores;
-- 公用表表达式(CTE)优化复杂查询
WITH high_spenders AS (
SELECT user_id, SUM(amount) AS total_spent
FROM orders
GROUP BY user_id
HAVING total_spent > 10000
)
SELECT u.username, h.total_spent
FROM users u
JOIN high_spenders h ON u.id = h.user_id;
二、分库分表实战指南
1. 分片策略设计
场景:某电商平台订单表日均新增50万条,需水平分库分表。
方案:
- 分片键 :选择
user_id
作为分片键,采用哈希取模(user_id % 8
) - 分片数量:8个库,每个库包含16张表(总128分片)
- 路由规则 :订单表
orders
按user_id
分片,关联的order_items
表采用相同分片规则
2. 分布式ID生成
使用雪花算法(Snowflake)生成唯一ID:
ini
public class SnowflakeIdGenerator {
private final long workerId;
private long lastTimestamp = -1L;
private long sequence = 0L;
public SnowflakeIdGenerator(long workerId) {
this.workerId = workerId;
}
public synchronized long nextId() {
long timestamp = System.currentTimeMillis();
if (timestamp < lastTimestamp) {
throw new RuntimeException("Clock moved backwards");
}
if (timestamp == lastTimestamp) {
sequence = (sequence + 1) & 0xFFF;
if (sequence == 0) {
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0;
}
lastTimestamp = timestamp;
return ((timestamp - 1288834974657L) << 22) | (workerId << 12) | sequence;
}
private long tilNextMillis(long lastTimestamp) {
long timestamp = System.currentTimeMillis();
while (timestamp <= lastTimestamp) {
timestamp = System.currentTimeMillis();
}
return timestamp;
}
}
3. 数据迁移方案
使用ShardingSphere-Scaling实现零停机迁移:
- 配置迁移任务:
yaml
sourceRule:
dataSources:
ds0: jdbc:mysql://old-db:3306/mall?user=root&password=123456
tables:
orders:
actualDataNodes: ds0.orders
destinationDataSources:
- jdbc:mysql://new-db-0:3306/mall?user=root&password=123456
- jdbc:mysql://new-db-1:3306/mall?user=root&password=123456
- 启动迁移:
arduino
curl -X POST "http://scaling-server:8080/migration" \
-H "Content-Type: application/json" \
-d @migration-config.yaml
三、DBLE中间件实战
1. 快速安装(Docker)
ruby
# 下载docker-compose.yml
wget https://raw.githubusercontent.com/actiontech/dble/master/docker-images/docker-compose.yml
# 启动DBLE及MySQL实例
docker-compose up -d
# 连接DBLE服务端口(8066)
mysql -h 127.0.0.1 -P 8066 -u root -p123456
# 连接管理端口(9066)
mysql -h 127.0.0.1 -P 9066 -u man1 -p654321
2. 核心配置文件
schema.xml(定义逻辑库和分片规则):
ini
<schema name="mall" checkSQLschema="false" sqlMaxLimit="100">
<table name="orders" primaryKey="id" dataNode="dn0,dn1" rule="sharding-by-userid" />
</schema>
<dataNode name="dn0" dataHost="dh0" database="db0" />
<dataNode name="dn1" dataHost="dh1" database="db1" />
<dataHost name="dh0" maxCon="1000" minCon="10" balance="1">
<heartbeat>SELECT 1</heartbeat>
<writeHost host="mysql0" url="jdbc:mysql://192.168.1.100:3306" user="root" password="123456">
<readHost host="mysql0-slave" url="jdbc:mysql://192.168.1.101:3306" user="root" password="123456" />
</writeHost>
</dataHost>
rule.xml(定义分片算法):
xml
<rule name="sharding-by-userid">
<columns>user_id</columns>
<algorithm class="io.mycat.route.function.PartitionByHash">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</algorithm>
</rule>
四、MySQL高可用架构搭建(InnoDB Cluster)
1. 环境准备
- 3台MySQL节点(8.0+)
- 1台ProxySQL代理节点
2. 节点配置
my.cnf(所有节点):
ini
[mysqld]
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
3. 集群初始化
- 创建集群:
css
mysqlsh --user=admin --password=secret --host=192.168.1.100:3306
dba.createCluster('mycluster')
- 添加节点:
arduino
cluster.addInstance('admin:secret@192.168.1.101:3306');
cluster.addInstance('admin:secret@192.168.1.102:3306');
- 配置ProxySQL:
sql
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight)
VALUES (100, '192.168.1.100', 3306, 1),
(1000, '192.168.1.101', 3306, 1),
(1000, '192.168.1.102', 3306, 1);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
4. 故障转移测试
- 模拟主节点宕机:
arduino
systemctl stop mysqld
- 验证新主节点:
sql
SELECT * FROM performance_schema.replication_group_members;
- 恢复原主节点:
sql
systemctl start mysqld
五、监控与运维
1. DBLE监控
使用Prometheus+Grafana监控JVM指标:
- 配置JMX Exporter:
ruby
java -javaagent:jmx_prometheus_javaagent-0.15.0.jar=8099:/config/prometheus-jmx-config.yaml -jar dble.jar
- Prometheus配置:
yaml
scrape_configs:
- job_name: 'dble'
static_configs:
- targets: ['dble-server:8099']
2. MySQL集群监控
使用Percona Monitoring and Management (PMM):
arduino
# 安装PMM Client
curl -s https://repo.percona.com/apt/percona-release_latest.generic_all.deb | dpkg -i -
percona-release setup pmm2
apt-get update && apt-get install pmm-client
# 注册节点
pmm-admin add mysql --host=192.168.1.100 --user=admin --password=secret
六、核心工具推荐
工具 | 功能描述 |
---|---|
ShardingSphere | 开源分布式数据库中间件,支持分库分表、读写分离、分布式事务 |
ProxySQL | 高性能MySQL代理,支持读写分离、连接池管理、查询路由 |
Percona XtraBackup | 热备份工具,支持InnoDB和XtraDB存储引擎的物理备份 |
pt-query-digest | MySQL查询分析工具,帮助识别慢查询和优化索引 |
Zabbix | 企业级监控系统,支持数据库性能指标采集和告警 |