数据库入门指南与实战进阶-Mysql篇

以下是数据库入门与实战进阶的完整指南,涵盖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实现零停机迁移:

  1. 配置迁移任务
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
  1. 启动迁移
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. 集群初始化
  1. 创建集群
css 复制代码
mysqlsh --user=admin --password=secret --host=192.168.1.100:3306
dba.createCluster('mycluster')
  1. 添加节点
arduino 复制代码
cluster.addInstance('admin:secret@192.168.1.101:3306');
cluster.addInstance('admin:secret@192.168.1.102:3306');
  1. 配置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. 故障转移测试
  1. 模拟主节点宕机
arduino 复制代码
systemctl stop mysqld
  1. 验证新主节点
sql 复制代码
SELECT * FROM performance_schema.replication_group_members;
  1. 恢复原主节点
sql 复制代码
systemctl start mysqld

五、监控与运维

1. DBLE监控

使用Prometheus+Grafana监控JVM指标:

  1. 配置JMX Exporter
ruby 复制代码
java -javaagent:jmx_prometheus_javaagent-0.15.0.jar=8099:/config/prometheus-jmx-config.yaml -jar dble.jar
  1. 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 企业级监控系统,支持数据库性能指标采集和告警
相关推荐
用户298698530142 分钟前
如何使用 Spire.Doc 在 Word 中查找和替换文本?
后端
宫水三叶的刷题日记12 分钟前
真的会玩,钉钉前脚辟谣高管凌晨巡查工位,小编随后深夜发文
前端·后端·面试
天天摸鱼的java工程师12 分钟前
Go 语言未来会取代 Java 吗?
java·后端
野犬寒鸦31 分钟前
力扣hot100:最大子数组和的两种高效方法:前缀和与Kadane算法(53)
java·后端·算法
AAA修煤气灶刘哥35 分钟前
《从 0 到 1 上手:RBAC+SpringSecurity 权限管理教程》
java·后端·安全
倚栏听风雨1 小时前
CompletableFuture 延时执行任务
后端
舒一笑1 小时前
MySQL中模糊匹配like的一个坑
后端·mysql
BingoGo1 小时前
PHP 集成 FFmpeg 处理音视频处理完整指南
后端·php
数字人直播1 小时前
稳了!青否数字人分享3大精细化AI直播搭建方案!
前端·后端
掘金一周1 小时前
被老板逼出来的“表格生成器”:一个前端的自救之路| 掘金一周 8.21
前端·人工智能·后端