MySQL 是 OLTP 王者,擅长高并发点查和简单写入。但当数据量破千万、JOIN 变复杂、报表跑不动时,就需要 Greenplum 这样的 OLAP 数据库了。
📌 迁移不是“取代 MySQL”,而是“架构分层”:MySQL 管交易,Greenplum 管分析。
|
|
|
|
|---|---|---|
| 慢查询暴增 |
|
|
| 报表跑不动 |
|
|
| 实时 BI 需求 |
|
|
| 数据量爆发 |
|
|
| 夜间 ETL 窗口不够 |
|
|
📌 经典的分层架构: MySQL(业务库)→ ETL → Greenplum(分析库)→ 报表/BI
|
|
|
|
|
|---|---|---|---|
| 架构 |
|
|
|
| 索引 |
|
|
|
| JOIN 能力 |
|
|
|
| 聚合能力 |
|
|
|
| 分区 |
|
|
|
| 并发写入 |
|
|
|
| 数据压缩 |
|
|
|
第一步:评估 → 第二步:转换 → 第三步:迁移 → 第四步:验证 → 第五步:切换 → 第六步:优化
-- MySQL 端:统计库和表
SELECT
table_schema,
table_name,
round(((data_length + index_length) / 1024 / 1024 / 1024), 2) AS size_gb,
table_rows
FROM information_schema.tables
WHERE table_schema = 'mydb'
ORDER BY size_gb DESC;
评估清单:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MySQL → Greenplum 数据类型映射:
|
|
|
|
|---|---|---|
INT(N) |
int |
|
BIGINT(N) |
bigint |
|
VARCHAR(N) |
varchar(N) |
|
TEXT |
text |
|
DATETIME |
timestamp |
|
TIMESTAMP |
timestamp |
|
DECIMAL(M,D) |
numeric(M,D) |
|
ENUM |
text
|
|
TINYINT(1) |
boolean |
|
AUTO_INCREMENT |
serial
|
|
表结构转换示例:
-- MySQL 原表
CREATE TABLE orders_mysql (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
amount DECIMAL(10,2),
status ENUM('pending','paid','shipped','completed'),
create_time DATETIME,
INDEX idx_user (user_id),
INDEX idx_time (create_time)
) ENGINE=InnoDB;
-- Greenplum 目标表(优化后)
CREATE TABLE orders_gp (
order_id bigint,
user_id int NOT NULL,
amount numeric(10,2),
status text,
create_time timestamp,
CHECK (status IN ('pending','paid','shipped','completed'))
) WITH (appendonly=true, orientation=column, compresstype=zstd)
DISTRIBUTED BY (user_id) -- 按 user_id 分布,便于 JOIN
PARTITION BY RANGE (create_time); -- 按时间分区
常用转换对照表:
|
|
|
|---|---|
LIMIT N, M |
LIMIT M OFFSET N |
NOW() |
now() |
CURDATE() |
current_date |
IFNULL(col, default) |
coalesce(col, default) |
IF(cond, t, f) |
CASE WHEN cond THEN t ELSE f END |
GROUP_CONCAT() |
string_agg() |
UNIX_TIMESTAMP() |
extract(epoch from now()) |
FROM_UNIXTIME(ts) |
to_timestamp(ts) |
INSERT ... ON DUPLICATE KEY UPDATE |
INSERT ... ON CONFLICT DO UPDATE |
迁移方案:
|
|
|
|
|
|---|---|---|---|
| mysqldump + COPY |
|
|
|
| CSV 导出 + gpfdist |
|
|
|
| MySQL FDW + INSERT |
|
|
|
| ETL 工具(DataX/Kettle) |
|
|
|
-- 1. 行数对比
SELECT 'MySQL' as source, count(*) FROM mysql_orders
UNION ALL
SELECT 'Greenplum' as source, count(*) FROM orders_gp;
-- 2. 关键业务指标对比
SELECT
'MySQL' as source,
sum(amount),
avg(amount),
min(create_time),
max(create_time)
FROM mysql_orders
UNION ALL
SELECT
'Greenplum',
sum(amount),
avg(amount),
min(create_time),
max(create_time)
FROM orders_gp;
-- 3. 枚举值分布对比
SELECT status, count(*) FROM mysql_orders GROUP BY status
UNION ALL
SELECT status, count(*) FROM orders_gp GROUP BY status
ORDER BY status, source;
迁移后常见问题及调优:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
gp_segment_id
分布 |
|
|
|
|
|
|
|
|
|
|
|
|
背景 :
MySQL 单表 2 亿行,JOIN 报表经常超时
夜间 ETL 跑 6 小时,影响业务
迁移效果 :
|
|
|
|
|
|---|---|---|---|
|
|
|
|
97% ↓ |
|
|
|
|
99% ↓ |
|
|
|
|
89% ↓ |
|
|
|
|
78% ↓ |
|
|
|
|
10 倍 ↑ |
MySQL 到 Greenplum 迁移的核心要点:
|
|
|
|---|---|
| 场景分离 |
|
| 分布键设计 |
|
| 列存 + 压缩 |
|
| SQL 重写 |
|
| 增量同步 |
|
MySQL 和 Greenplum 不是二选一,而是搭档。一个管交易,一个管分析。
软件分享,留言获取地址:
是一个充满活力的创意社区,拥有超过4.3百万张优质图片和视频素材,让你轻松应对各种设计场景。共享免版权高清照片和库存图片、新的插图矢量图、高质量视频、热门动态GIF和最佳音频音乐,全部可免费下载。所有内容都遵循Pixabay许可证发布,可以安全使用,无需归属,甚至适用于商业用途
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29568843/viewspace-3183120/ ,如需转载,请注明出处,否则将追究法律责任。