6. MySQL 数据库优化与NOSQL
MySQL 数据库优化与NOSQL
一、Mycat 分布式存储
1.1 Mycat 概述
Mycat 是 MySQL 中间件,可实现读写分离、高可用冗余、垂直分表、水平分表。
| 端口 | 用途 |
|---|---|
| 8066 | 数据端口,应用程序通过此端口访问 |
| 9066 | 管理端口 |
1.2 环境规划与多实例部署
架构规划: 2 台虚拟主机,每台 4 个实例
| 实例 | DB01 server_id | DB02 server_id | 关系 |
|---|---|---|---|
| 3307 | 7 | 17 | 双主互为主从 |
| 3308 | 8 | 18 | 双主互为主从 |
| 3309 | 9 | 19 | 各自 3307 的从库 |
| 3310 | 10 | 20 | 各自 3308 的从库 |
清理环境 + 初始化实例(两台主机均操作):
pkill mysqld
rm -rf /data/330*
mv /etc/my.cnf /etc/my.cnf.bak
mkdir /data/33{07..10}/data -p && chown -R mysql.mysql /data/*
# 初始化 4 个实例
mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3310/data --basedir=/usr/local/mysql
实例配置文件(以 3307 为例,其他仅改 port/server_id/路径):
# cat >/data/3307/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
port=3307
log-error=/data/3307/mysql.log
log_bin=/data/3307/mysql-bin
binlog_format=row
skip-name-resolve
server-id=7 # 每个实例不同
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF
systemd 启动文件(以 3307 为例,其他仅改路径):
# cat >/etc/systemd/system/mysqld3307.service<<EOF
[Unit]
Description=MySQL Server
After=network.target syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE=5000
EOF
systemctl daemon-reload
systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309
systemctl start mysqld3310
# 验证
mysql -S /data/3307/mysql.sock -e "show variables like 'server_id'"
1.3 双主 + 从库构建
3307 双主(DB01:3307 ↔ DB02:3307):
# 【DB01】创建用户
mysql -S /data/3307/mysql.sock -e \
"create user repl@'10.0.0.%' identified with mysql_native_password by '123';
grant replication slave on *.* to repl@'10.0.0.%';
create user root@'10.0.0.%' identified with mysql_native_password by '123';
grant all on *.* to root@'10.0.0.%';"
# 【DB02】指向 DB01 为主
mysql -S /data/3307/mysql.sock -e \
"change master to master_host='10.0.0.51', master_port=3307,
master_auto_position=1, master_user='repl', master_password='123';
start slave;"
# 【DB01】指向 DB02 为主
mysql -S /data/3307/mysql.sock -e \
"change master to master_host='10.0.0.52', master_port=3307,
master_auto_position=1, master_user='repl', master_password='123';
start slave;"
3309 从库(各自同步本地 3307):
# 【DB01】3309 ← 3307
mysql -S /data/3309/mysql.sock -e \
"change master to master_host='10.0.0.51', master_port=3307,
master_auto_position=1, master_user='repl', master_password='123';
start slave;"
# 【DB02】3309 ← 3307
mysql -S /data/3309/mysql.sock -e \
"change master to master_host='10.0.0.52', master_port=3307,
master_auto_position=1, master_user='repl', master_password='123';
start slave;"
3308 双主 + 3310 从库:同上模式,端口改为 3308/3310
异常重置:
mysql -S /data/3307/mysql.sock -e "stop slave;reset slave all;"
1.4 Mycat 安装
yum install -y java # Java 运行环境
cd /usr/local
tar xf Mycat-server-1.6.7.4-release-*.linux\ .tar.gz
tar xf mysql-connector-java-8.0.21.tar.gz # 可选:升级 MySQL 驱动
vim /etc/profile
# export PATH=/usr/local/mycat/bin:$PATH
source /etc/profile
mycat start
mysql -uroot -p123456 -h 127.0.0.1 -P8066
# 连接失败时(Java 驱动兼容问题),替换驱动后重启
cp mysql-connector-java-8.0.21/mysql-connector-java-8.0.21.jar /usr/local/mycat/lib/
mycat restart
1.5 功能一:读写分离
<!-- schema.xml -->
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="world" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="db1" url="10.0.0.51:3307" user="root" password="123">
<readHost host="db2" url="10.0.0.51:3309" user="root" password="123" />
</writeHost>
</dataHost>
</mycat:schema>
关键参数:
balance="1"表示读操作分发到所有 readHost 和 standby writeHost
mysql -uroot -p123456 -h 10.0.0.51 -P8066
select @@server_id; -- 读 → 3309 从库
begin; select @@server_id; -- 写 → 3307 主库
1.6 功能二:高可用冗余
配置两个 writeHost,主库故障时自动切换到备用 writeHost。
<dataHost name="xiaoq1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="db1" url="10.0.0.51:3307" user="root" password="123">
<readHost host="db2" url="10.0.0.51:3309" user="root" password="123" />
</writeHost>
<writeHost host="db3" url="10.0.0.52:3307" user="root" password="123">
<readHost host="db4" url="10.0.0.52:3309" user="root" password="123" />
</writeHost>
</dataHost>
switchType="1"表示自动切换。测试:停掉 DB01 的 3307 → 写操作自动切到 DB02 的 3307
1.7 功能三:垂直分表
将不同表存储到不同主从架构(不同 dataHost)。
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1">
<table name="user" dataNode="sh1" /> <!-- user → xiaoq1 架构 -->
<table name="order_t" dataNode="sh2" /> <!-- order_t → xiaoq2 架构 -->
</schema>
<dataNode name="sh1" dataHost="xiaoq1" database="taobao" />
<dataNode name="sh2" dataHost="xiaoq2" database="taobao" />
1.8 功能四:水平分表
将一个大表的数据按分片规则拆分到不同节点。
① 范围分片(auto-sharding-long):
<!-- schema.xml -->
<table name="t3" dataNode="sh1,sh2" rule="auto-sharding-long" />
<!-- rule.xml -->
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns> <!-- 分片键 -->
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
-- autopartition-long.txt
0-10=0 -- id 0~10 → 节点0
10-20=1 -- id 10~20 → 节点1
② 取模分片(mod-long):
<table name="t4" dataNode="sh1,sh2" rule="mod-long" />
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property> -- 节点数
</function>
规则:
id % 2 = 0→ 节点0,id % 2 = 1→ 节点1
③ 枚举分片(sharding-by-intfile):
<table name="t5" dataNode="sh1,sh2" rule="sharding-by-intfile" />
<tableRule name="sharding-by-intfile">
<rule>
<columns>name</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">1</property>
</function>
-- partition-hash-int.txt
bj=0 -- 北京数据 → 节点0
sh=1 -- 上海数据 → 节点1
DEFAULT_NODE=1 -- 未匹配 → 节点1
三种分片对比:
| 分片方式 | 规则 | 适用场景 |
|---|---|---|
| 范围分片 | id 落在指定区间 → 固定节点 | 数据有明确区间特征 |
| 取模分片 | id % 节点数 → 目标节点 | 等值随机查找,数据均匀分布 |
| 枚举分片 | 字段值匹配映射表 → 目标节点 | 跨地域区域存储 |
1.9 功能五:全局表
每个节点保存完整副本,修改时所有节点同步更新,适合字典表等小表。
<table name="t_area" primaryKey="id" type="global" dataNode="sh1,sh2" />
1.10 功能六:ER 表
子表通过外键关联父表的分片规则,保证关联数据在同一节点,避免跨库 JOIN。
<table name="a" dataNode="sh1,sh2" rule="mod-long_xiaoq">
<childTable name="b" joinKey="aid" parentKey="id" />
</table>
a 表的 id 分到哪个节点,b 表中 aid 相同的记录也跟着到同一节点。
二、数据库优化与 Percona Toolkit 工具
2.1 数据库优化九大层面
| 层面 | 说明 | 示例 |
|---|---|---|
| ① 硬件层面 | CPU、内存、磁盘(SSD)、网络 | 磁盘 IO 瓶颈替换为 SSD |
| ② 系统层面 | 操作系统参数调优 | 文件句柄数、swap、内核参数 |
| ③ 软件版本 | 选择合适的 MySQL 版本 | 5.7 → 8.0 新特性利用 |
| ④ 结构参数 | my.cnf 配置优化 | innodb_buffer_pool_size、连接数 |
| ⑤ 开发规范 | SQL 编写规范 | 禁止 SELECT *、合理使用索引 |
| ⑥ 索引优化 | 索引设计与使用 | 联合索引最左前缀、避免索引失效 |
| ⑦ 事务及锁 | 事务隔离级别、锁策略 | 避免长事务、合理选择隔离级别 |
| ⑧ 架构设计 | 读写分离、分库分表、缓存 | 主从 + Mycat/ProxySQL + Redis |
| ⑨ 安全优化 | 用户权限、数据加密、审计 | 最小权限原则、SQL 注入防护 |
2.2 PT 工具安装
yum install -y percona-toolkit-3.1.0-2.el7.x86_64.rpm
2.3 pt-archiver(数据归档)
作用:将表中数据归档到其他表或文件,或清理历史数据。
# 数据归档(t100w → test1,条件 id<10000)
pt-archiver --source h=10.0.0.51,P=3307,D=oldboy,t=t100w,u=root,p=123 \
--dest h=10.0.0.51,P=3307,D=oldboy,t=test1,u=root,p=123 \
--where 'id<10000' --no-check-charset --no-delete \
--limit=1000 --commit-each --progress 1000 --statistics
# 数据清理(直接删除)
pt-archiver --source h=10.0.0.51,P=3307,D=oldboy,t=t100w,u=root,p=123 \
--where 'id<10000' --purge --limit=1 --no-check-charset
# 数据导出到文件
pt-archiver --source h=10.0.0.51,P=3307,D=oldboy,t=t100w,u=root,p=123 \
--where '1=1' --no-check-charset --no-delete --file="/tmp/archiver.csv"
2.4 pt-online-schema-change(在线表结构变更)
无锁修改表结构,通过影子表 + 触发器同步 + 原子替换实现。
# 先 dry-run 预览,再 execute 执行
pt-online-schema-change --user=root --password=123 --host=10.0.0.51 --port=3307 \
--alter "add column state int not null default 1" D=oldboy,t=test1 --print --dry-run
pt-online-schema-change --user=root --password=123 --host=10.0.0.51 --port=3307 \
--alter "add column state int not null default 1" D=oldboy,t=test1 --print --execute
2.5 pt-table-checksum(主从数据一致性校验)
# 准备:创建校验库和用户
CREATE DATABASE pt CHARACTER SET utf8;
CREATE USER checksum@'10.0.0.%' IDENTIFIED WITH mysql_native_password BY 'checksum';
GRANT ALL ON *.* TO checksum@'10.0.0.%';
# 从库配置 report 信息
vim /data/3309/my.cnf
# report_host='10.0.0.51'
# report_port='3309'
# 执行校验
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format \
--replicate=pt.checksums --create-replicate-table \
--databases=test --tables=t1 h=10.0.0.51,P=3307,u=checksum,p=checksum
2.6 pt-table-sync(修复主从数据不一致)
# 先 print 预览修复 SQL,再 execute 执行
pt-table-sync --replicate=pt.checksums --databases test --tables t1 \
h=10.0.0.51,u=checksum,p=checksum,P=3307 \
h=10.0.0.51,u=checksum,p=checksum,P=3309 --print
pt-table-sync --replicate=pt.checksums --databases test --tables t1 \
h=10.0.0.51,u=checksum,p=checksum,P=3307 \
h=10.0.0.51,u=checksum,p=checksum,P=3309 --execute
2.7 pt-duplicate-key-checker(冗余索引检查)
pt-duplicate-key-checker --database=test --host=10.0.0.51 --user=root --password=123 --port=3307
2.8 pt-kill(会话管理)
| 场景 | 关键参数 |
|---|---|
| 杀空闲超过 5 秒的连接 | --match-command sleep --idle-time 5 |
| 杀 SELECT 超过 60 秒 | --busy-time 60 --match-info "select|SELECT" |
| 杀指定模式 SQL | --match-info "select IFNULL.*" |
| 杀 Locked 状态 | --match-state="Locked" |
| 杀指定库+来源 IP | --match-db="a" --match-host='10.0.0.11' |
| 杀指定用户 | --match-user="root" |
| 杀 query/Execute 状态 | --match-command="query|Execute" |
通用参数模板:
pt-kill --user=用户名 --password=密码 --victim all \
--间隔参数 --kill --daemonize \
-S /tmp/mysql.sock --pid=/tmp/ptkill.pid --print --log=/tmp/pt-kill.log &
2.9 pt-slave-find(主从拓扑发现)
pt-slave-find -h10.0.0.51 -P3307 -uchecksum -pchecksum
2.10 pt-heartbeat(主从延时精确监控)
# 【主库】后台写入心跳记录
pt-heartbeat --user=root --ask-pass --host=10.0.0.51 --port=3307 \
--create-table -D test --interval=1 --update --replace --daemonize
# 【从库】监控延时
pt-heartbeat --user=root --password=123 --host=10.0.0.51 --port=3309 \
-D test --table=heartbeat --monitor --file=/tmp/aa.log &
# 模拟延时验证
STOP SLAVE SQL_THREAD;
2.11 pt-show-grants(权限梳理)
pt-show-grants -h10.0.0.51 -P3307 -uchecksum -pchecksum
三、Redis 缓存服务
3.1 安装与配置
cd /usr/local/
wget https://download.redis.io/releases/redis-6.2.10.tar.gz
tar xf redis-6.2.10.tar.gz && ln -s redis-6.2.10 redis
yum install -y gcc automake autoconf libtool make
cd redis && make
vim /etc/profile
# export PATH=/usr/local/redis/src:$PATH
source /etc/profile
配置文件:
mkdir -p /data/6379
cat >/data/6379/redis.conf<<EOF
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dump.rdb
EOF
redis-cli shutdown # 关闭默认实例
redis-server /data/6379/redis.conf # 加载配置启动
关闭保护模式 + 设置密码:
vim /data/6379/redis.conf
# bind 10.0.0.51 127.0.0.1
# requirepass 123456
redis-cli -h 10.0.0.51 -p 6379 -a 123456
# 运行时查看/修改配置
config get key
config set key 值
3.2 持久化
| 方式 | 说明 | 配置 |
|---|---|---|
| RDB | 快照方式,定时保存数据集到 dump.rdb | save 900 1(900秒内至少1次变化则触发) |
| AOF | 追加日志,记录每个写命令 | appendonly yes + appendfsync |
RDB 手动触发:
save -- 立即保存(阻塞主线程)
bgsave -- 后台 fork 子进程保存(推荐,不阻塞)
AOF 同步策略:
| 策略 | 说明 | 性能 | 安全 |
|---|---|---|---|
always |
每个命令立即同步 | 最差 | 最高 |
everysec |
每秒同步一次(推荐) | 中等 | 中等 |
no |
交给操作系统决定 | 最好 | 最低 |
3.3 基础操作
set key value -- 设置键值对
get key -- 获取值
del key -- 删除
expire key 60 -- 设置过期时间(秒)
ttl key -- 查看剩余过期时间
persist key -- 取消过期
exists key -- 判断键是否存在
rename old_key new_key -- 修改键名
3.4 五大数据类型
① String(字符串):
mset id 101 name xiaoQ age 20 gender m -- 批量设置
incr num_101 -- 数值+1
decr num_101 -- 数值-1
incrby num_101 10000 -- 数值+10000
decrby num_101 5000 -- 数值-5000
② Hash(哈希,缓存数据库行数据):
hmset stu01 id 101 name xiaoQ age 20 gender m -- 存储一条记录
hmget stu01 id name age gender -- 获取指定字段
hgetall stu01 -- 获取所有字段
# 从 MySQL 批量缓存到 Redis
SELECT CONCAT("hmset city_",id," id ",id," name ",name)
FROM world.city LIMIT 10 INTO OUTFILE '/tmp/hmset.txt';
cat /tmp/hmset.txt | redis-cli -a 123456 -- 执行批量写入
hgetall city_1 -- 验证
③ List(列表,消息/评论场景):
LPUSH wechat "nice day" -- 左侧插入
LPUSH wechat "bad day"
LPUSH wechat "good day"
lrange wechat 0 -1 -- 获取全部(0 到 -1)
④ Set(集合,交并差运算):
sadd xiaoQ xiaoA xiaoB oldgirl tom -- 创建集合
SUNION xiaoQ oldboy -- 并集
SINTER xiaoQ oldboy -- 交集
SDIFF oldboy xiaoQ -- 差集
⑤ Sorted Set / ZSet(有序集合,排行榜):
zadd topN 0 smlt 0 fskl 0 fshkl -- 初始化成员(分数为0)
ZINCRBY topN 100000 smlt -- smlt 加 100000 分
ZINCRBY topN 1000000 fshkl -- fshkl 加 1000000 分
ZREVRANGE topN 0 2 -- 取 Top3(降序)
3.5 事务
multi -- 开始事务
set key1 value1
set key2 value2
exec -- 提交
# 或
discard -- 取消
Redis 事务不支持回滚,命令出错不会被撤销。
3.6 主从同步
第一步:部署多实例(6380 主 + 6381/6382 从):
mkdir -p /data/638{0..2}
cat >/data/6380/redis.conf <<EOF
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
requirepass 123
masterauth 123 -- 连接主库的密码
EOF
# 6381/6382 配置相同,仅改端口
redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf
第二步:从库开启同步 + 验证:
redis-cli -p 6381 -a 123 slaveof 127.0.0.1 6380 -- 从库1 指向主库
redis-cli -p 6382 -a 123 slaveof 127.0.0.1 6380 -- 从库2 指向主库
redis-cli -p 6380 -a 123 info replication -- 主库视角查看同步状态
redis-cli -p 6381 -a 123 info replication -- 从库视角查看同步状态
# 解除主从
redis-cli -p 6382 -a 123 slaveof no one
3.7 哨兵高可用(Sentinel)
部署哨兵:
mkdir /data/26380
cat >/data/26380/sentinel.conf <<EOF
port 26380
dir "/data/26380"
sentinel monitor mymaster 127.0.0.1 6380 1 -- 监控主库,1=至少1个哨兵同意切换
sentinel down-after-milliseconds mymaster 5000 -- 主库不可达超时(毫秒)
sentinel auth-pass mymaster 123 -- 主库密码
EOF
redis-sentinel /data/26380/sentinel.conf &>/tmp/sentinel.log &
故障切换验证:
# 模拟主库宕机
redis-cli -p 6380 -a 123 shutdown
# 从库自动选举为新主
redis-cli -p 6381 -a 123 info replication
# 恢复原主库(自动降级为从库)
redis-server /data/6380/redis.conf
redis-cli -p 6381 -a 123 info replication
哨兵实现 Redis 高可用,但前端程序需自行感知地址变化。
3.8 Cluster 集群
架构: 最少 6 节点(3 主 3 从),数据按 16384 个槽位 分布式存储。
第一步:部署 6 个实例(7000~7005):
# Redis 5.0 之前版本需安装 Ruby 插件
yum install ruby rubygems -y
gem sources -a http://mirrors.aliyun.com/rubygems/
gem sources --remove http://rubygems.org/
gem install redis -v 3.3.3
mkdir -p /data/700{0..5}
# 每个实例配置相同,仅端口不同
cat >/data/7000/redis.conf <<EOF
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes -- 开启集群模式
cluster-config-file nodes.conf -- 集群配置文件
cluster-node-timeout 5000
appendonly yes
EOF
# 启动全部 6 个实例
for i in $(seq 0 5); do redis-server /data/700$i/redis.conf; done
第二步:创建集群(3 主 3 从):
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
# 查看节点分配
redis-cli -p 7000 cluster nodes | grep master
redis-cli -p 7000 cluster nodes | grep slave
集群扩容(添加新主 7006 + 新从 7007):
mkdir /data/700{6..7}
# 编写配置文件(同上,改端口),启动实例
redis-server /data/7006/redis.conf
redis-server /data/7007/redis.conf
# 添加主节点并重新分配槽位
redis-cli --cluster reshard 127.0.0.1:7000
# 根据提示输入:分配多少槽位 → 接收节点ID(7006) → 源节点ID
# 添加从节点(指定其主节点)
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 \
--cluster-slave --cluster-master-id <7006的node-id>
集群缩容(删除 7006 主 + 7007 从):
# 第一步:移除 7006 的槽位,分配给 7000/7001/7002
redis-cli --cluster reshard 127.0.0.1:7000
# 第二步:删除从节点 7007
redis-cli --cluster del-node 127.0.0.1:7007 <7007的node-id>
# 第三步:删除主节点 7006
redis-cli --cluster del-node 127.0.0.1:7006 <7006的node-id>
四、MongoDB 文档型数据库入门
4.1 概述
MongoDB 是文档型 NoSQL 数据库,数据以 BSON(类 JSON)格式存储,无固定表结构。
| 对比项 | MySQL | MongoDB |
|---|---|---|
| 数据模型 | 关系型(表/行/列) | 文档型(集合/文档) |
| Schema | 固定表结构 | 灵活,文档结构可不同 |
| 查询语言 | SQL | JavaScript 风格 |
| 扩展方式 | 垂直/水平拆分 | 原生分片 |
| 适用场景 | 事务一致性要求高 | 海量数据、灵活结构、高并发 |
4.2 基础概念对照
| MySQL | MongoDB | 说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 集合(表) |
| row | document | 文档(行) |
| column | field | 字段(列) |
| index | index | 索引 |
| primary key | _id |
主键(自动生成 ObjectId) |
4.3 常用操作
// 插入文档
db.collection.insertOne({name: "xiaoQ", age: 20})
db.collection.insertMany([{name: "a"}, {name: "b"}])
// 查询文档
db.collection.find() // 查询全部
db.collection.find({age: 20}) // 条件查询
db.collection.findOne({name: "xiaoQ"}) // 查询一条
// 更新文档
db.collection.updateOne({name: "xiaoQ"}, {$set: {age: 21}})
db.collection.updateMany({}, {$set: {status: 1}})
// 删除文档
db.collection.deleteOne({name: "xiaoQ"})
db.collection.deleteMany({age: {$lt: 18}})
附录:知识要点速查表
| 类别 | 要点 |
|---|---|
| Mycat 核心 | 读写分离(balance=1)、高可用(switchType=1)、垂直/水平分表、全局表(type=global)、ER 表(childTable) |
| 水平分片 | 范围(autopartition-long)、取模(PartitionByMod)、枚举(PartitionByFileMap) |
| 优化九层 | 硬件→系统→版本→参数→规范→索引→事务锁→架构→安全 |
| PT-archiver | --dest 归档、--purge 清理、--file 导出 |
| PT-osc | 先 --dry-run 预览,再 --execute 执行 |
| PT-checksum/sync | checksum 校验 → sync 修复(先 print 后 execute) |
| PT-kill | --match-* 匹配条件 + --daemonize 后台运行 |
| Redis 持久化 | RDB(save/bgsave)+ AOF(appendonly + appendfsync everysec) |
| Redis 数据类型 | String/Hash/List/Set/ZSet |
| Redis 高可用 | Sentinel 哨兵(自动选主)+ Cluster 集群(16384 槽位分片) |
| Cluster 操作 | --cluster create 创建、--cluster reshard 槽位迁移、--cluster add-node/del-node 扩缩容 |

浙公网安备 33010602011771号