## 为什么外贸站的海量产品表需要分库分表
外贸网站的产品数量动辄几十万甚至上百万,单张 MySQL 表数据量增长后,**索引效率下降、写入锁竞争加剧、备份恢复时间过长**。分库分表的核心思路是把一张大表拆成多个小表(分表),或者分散到多个数据库实例(分库),从而降低单表数据量,提升查询与写入性能。在宝塔面板下管理数据库非常方便,但分库分表需要额外配置中间件或修改代码逻辑,下面我会一步步带你完成。
## 准备工作:环境检查与方案选择
在操作前请确保宝塔面板已安装 **MySQL/MariaDB**(建议使用 5.7 及以上版本)和 **PHPMyAdmin** 或 **Adminer**,方便查看表结构。另外你需要知道当前产品表的总行数,可用 SQL 查询:
```sql
SELECT COUNT(*) FROM products;
```
如果行数超过 **500 万** 并且查询延迟明显增加,就值得考虑分表。分库分表方案主要有两种:
- **中间件方式**(如 MyCat、ShardingSphere-Proxy):无需修改业务代码(仅需改数据库连接地址),但需要额外部署和维护。
- **应用层分表**(如按 product_id 取模分表):需要修改 SQL 语句,灵活度高,适合有开发能力的团队。
本文以 **MyCat** 为例,因为它在宝塔环境下可通过 Docker 或直接部署,设置相对简单,并且对外贸站产品查询常用的 **按 ID 或分类** 路由友好。
## 分步操作:用 MyCat 实现分库分表
### 1. 下载并启动 MyCat
在宝塔面板的 SSH 终端中执行(也可用宝塔自带的终端):
```bash
cd /usr/local
wget http://dl.mycat.org.cn/2.0/Mycat-server-2.0-release.tar.gz
tar -zxvf Mycat-server-2.0-release.tar.gz
```
下一步继续进入 MyCat 目录修改配置文件 `conf/schema.xml` 和 `conf/rule.xml`。记得先用宝塔的 **软件商店** 检查是否已安装 Java(MyCat 依赖 Java 8+),若没有可用一行命令安装:
```bash
sudo yum install -y java-1.8.0-openjdk
```
### 2. 配置分片规则(以产品 ID 取模分 4 张表为例)
在宝塔面板中通过文件管理打开 `/usr/local/mycat/conf/schema.xml`,按如下示例设置:
```xml
```
注意:`dn1 ~ dn4` 指向同一个数据库的不同分表名,需要先在 `db_shop` 里创建四张表 `products_0`、`products_1`、`products_2`、`products_3`,表结构与原 `products` 一致。创建脚本可用:
```sql
CREATE TABLE `products_0` LIKE `products`;
CREATE TABLE `products_1` LIKE `products`;
CREATE TABLE `products_2` LIKE `products`;
CREATE TABLE `products_3` LIKE `products`;
```
接着编辑 `rule.xml`,添加取模规则:
```xml
id
mod-long
4
```
### 3. 启动 MyCat 并测试连接
回到终端执行:
```bash
cd /usr/local/mycat
./bin/mycat start
```
查看日志确保无报错:
```bash
tail -f logs/wrapper.log
```
若启动成功,MyCat 默认监听端口 8066。下面修改你外贸站源码中的数据库连接配置,将原来的连接地址改为 `127.0.0.1:8066`,用户名和密码使用 MyCat 的用户(默认 `root/123456`,可在 `server.xml` 中修改)。
## 避坑指南:事务、跨库查询与 ID 冲突
- **事务问题**:MyCat 对跨库事务支持有限,建议将同一个产品的相关信息(如描述、价格、库存)放在同一分片内,避免跨库 join。分片键尽量选择**经常作为查询条件的字段**,如 `product_id`,这样多数查询能落到单一节点。
- **ID 生成**:不要再使用 MySQL 自增主键,否则分片后不同表会出现重复 ID。建议改用雪花算法生成全局唯一 ID,宝塔面板中可使用 `UNIQUE_ID` 函数,或者在你的代码中集成。
- **数据迁移**:存量数据需要按分片规则重新分布。可以编写一个脚本循环读取原 `products` 表,根据 `id % 4` 插入对应的分表。注意迁移期间停服或只读,避免数据不一致。
## 效果验证:查询性能测试与监控
全部调整完成后,重启外贸站应用并访问几个原本加载缓慢的产品列表页。在宝塔面板的 **数据库管理** 中连接到 MyCat(端口 8066),执行同一条 SQL 对比响应时间:
```sql
-- 优化前(直连原表)
SELECT * FROM products WHERE category_id = 10 LIMIT 20;
-- 优化后(通过 MyCat)
SELECT * FROM products WHERE category_id = 10 LIMIT 20;
```
通常能看到 50% 以上的速度提升。你也可以使用宝塔面板自带的 **MySQL 慢查询日志**,检查慢 SQL 数量是否大幅下降。
另外再看一点,建议设置 **每 30 分钟** 的定时任务检查 MyCat 进程是否存活,以及分表的数据是否均匀(可通过 `SELECT COUNT(*)` 对比各分表的行数)。如果发现数据严重倾斜(例如一张表占了 80% 数据),说明分片键选择不当,需要调整规则重新迁移。
如果你在处理外贸站海量产品数据库优化过程中遇到其他问题,比如如何选择分片键、如何处理多表关联查询,可以在站内搜索相关进阶教程,或结合你的业务特点做微调。