ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MySQL驱动企业数据分析:从SQL清洗到架构实战全解析

MySQL驱动企业数据分析:从SQL清洗到架构实战全解析 做数据分析工作很多人的第一反应是 Python Pandas 或 Spark但在真实企业环境里SQL 和 MySQL 依然是最刚需的一层。项目标题是高级数据分析实训营 打造高端企业数据分析架构 基于MySQL核心驱动数据分析实战课程从名字看它不只是一门基础 SQL 教程而是把 MySQL 当作数据分析底座围绕企业级分析架构来讲。这篇文章就来拆解这套思路为什么 MySQL 可以用作数据分析核心引擎如何搭建一套可落地的分析环境怎样用 SQL 完成从清洗、聚合、窗口计算到业务分层分析的全过程以及批量任务和性能优化怎么做。内容适合这几类读者想从会写 SQL升级到能搭分析链路的数据分析师。想给业务团队提供自助分析能力的 MySQL 工程师。正在规划本地数据分析实训环境需要一份可复现方案的人。如果你已经把 MySQL 装好了可以直接跳到第 5 节看分析实战如果是从零开始建议按顺序过一遍。全程核心结论放在前面MySQL 在企业数据分析中的价值不是替代数仓或大数据组件而是在中小数据量下提供稳定、低成本、可运维的分析底座。1. 核心能力速览先给一张规格表后面所有内容都围绕这张表展开。这里没有给死数字因为不同 MySQL 版本、不同操作系统、不同数据量观察到的参数会有差异实际以本机测试为准。能力项说明项目定位企业级数据分析架构实训以 MySQL 为存储与计算核心核心能力数据清洗、聚合统计、窗口计算、用户分层、漏斗分析、报表输出数据库要求MySQL 5.7 或 8.0 以上8.0 推荐使用 Window Function 与 CTE操作系统Linux / Windows / macOS 均可实训环境建议 Linux 服务器部署方式yum/apt 安装、源码编译、Docker 容器均可是否支持批量任务支持。可通过存储过程 Event Scheduler 或 Shell crontab 实现是否支持接口 API可用 SQL 直接对接 BI 工具或通过 Python/Java 连接器封装为数据服务数据分析扩展可与 Python、Pandas、Superset、FineReport 等工具组合使用适合场景中小规模业务数据分析、报表开发、数据中台底层存储、教学实训从材料看这套实训体系强调的并不是某个 UI 工具而是把 MySQL 当作数据分析链路的中枢数据进来之后用 SQL 做清洗用存储过程做调度用视图和报表做输出。这个思路对数据量在百万到千万级的业务非常实用。2. 企业数据分析架构适用范围与边界2.1 这套架构适合什么场景MySQL 数据分析架构比较适合几类情况业务数据量在百万到千万级单表操作可以控制在秒级。团队以 SQL 为主要分析语言不希望引入过重的大数据组件。需要快速搭建报表、看板、经营分析模型对实时性要求不算极端。需要一套低成本、易维护的分析底座MySQL 本身就是很多业务系统的 OLTP 库直接复用可以省掉同步链路。举个例子一个电商业务订单表每天新增两万条数据累计到五百万条这时候 MySQL 加合理的索引和分区跑用户复购分析、地区销售汇总、RFM 分层完全没问题。除非数据量到了亿级并且查询模式非常复杂才需要考虑引入 ClickHouse、Doris 或数仓体系。2.2 不适合什么场景海量日志分析日增数十亿条MySQL 存储和计算压力过大。复杂的机器学习特征工程MySQL 处理不了嵌套的矩阵运算。超大规模并行计算MySQL 只是单机并行加主从复制横向扩展能力有限。高并发在线分析。在线交易和离线分析混合在同一实例时容易互相拖累。2.3 使用边界与合规提醒做数据分析实训和落地时要特别注意数据来源于业务系统或第三方时必须确认数据采集和使用的授权范围。涉及到个人隐私、用户行为、人脸或语音类数据时要遵守相关法律法规不能脱离授权范围处理数据。企业内部做数据分析项目通常要先通过数据安全评审明确脱敏要求和最小必要原则。任何技术教程里的数据都建议用脱敏样例数据演练不要在公网服务器上直接堆放生产库明文数据。3. 本地分析环境准备与前置条件无论你是个人学习还是团队实训环境准备按下面四层来检查。3.1 操作系统与硬件项目最低建议推荐CPU2 核4 核以上内存4 GB16 GB磁盘20 GB 空闲SSD 100 GB操作系统Windows 10 / Ubuntu 20.04CentOS 7.9 或 Ubuntu 22.04MySQL 属于 CPU 和磁盘密集型服务。数据分析场景下的 ORDER BY、GROUP BY 和 JOIN 都会消耗临时空间如果磁盘是机械硬盘大查询的表现会比较差实训阶段建议至少准备 10 GB 空闲空间主要给 binlog 和临时表使用。3.2 MySQL 版本选择MySQL 8.0 是当前实训的首选版本。它自带的窗口函数、公共表表达式CTE、NOWAIT等能力让 SQL 写数据分析逻辑时非常顺手。MySQL 5.7 虽然也能做大部分聚合分析但窗口函数需要绕道用变量实现代码可读性差很多。如果操作系统是 CentOS官方 yum 源里的 MySQL 版本可能比较老需要先配置 MySQL 官方 yum 仓库。Ubuntu 上建议通过 apt 安装mysql-server-8.0或者直接用 Docker。3.3 依赖工具MySQL 客户端命令行mysql或 MySQL Workbench。Python可选用于数据导入导出和数据加工建议 Python 3.9。数据分析可视化工具可选Superset、Metabase、FineReport 等。文本编辑器或 IDENavicat、DBeaver、VS Code 都可以。3.4 端口与目录规划MySQL 默认端口是 3306。实训环境中如果端口被占用可以在配置文件中修改port参数。数据目录默认在/var/lib/mysqlLinux或安装目录下的data文件夹Windows建议单独规划一块数据盘避免日志占满系统盘。4. MySQL 部署与数据分析环境启动这里给三套部署方式从简单到复杂依次是 Docker、apt/yum 源码包、通用编译安装。你可以根据本机环境选一种不需要三套都跑。4.1 Docker 方式启动 MySQLDocker 方式最省事适合个人实训和快速反复重置环境。# 拉取 MySQL 8.0 镜像并启动一个测试实例 docker run -d \ --name mysql-analysis \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDyour_password \ -e MYSQL_DATABASEanalysis \ -v /data/mysql:/var/lib/mysql \ mysql:8.0启动之后检查服务状态docker ps | grep mysql-analysis docker logs mysql-analysis --tail 50如果 3306 端口被占用把-p 13306:3306中的宿主端口改成 13306后续连接时就写-P 13306。4.2 Ubuntu / Debian 使用 apt 安装sudo apt update sudo apt install -y mysql-server-8.0 # 启动服务并检查状态 sudo systemctl enable mysql sudo systemctl start mysql sudo systemctl status mysql安装完成后默认 root 使用auth_socket认证需要手动切换成密码认证ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY your_password; FLUSH PRIVILEGES;4.3 初始化数据库与验证连接无论使用哪种方式安装完成后先验证连接mysql -uroot -p进入 MySQL 后执行SELECT VERSION(); SHOW VARIABLES LIKE port; SHOW VARIABLES LIKE character_set_server;可以看到当前 MySQL 版本、监听端口和字符集。如果字符集不是utf8mb4推荐改掉。很多数据分析类报表的中文乱码问题都出在这里。4.4 准备实训数据实训数据建议自己造一套与业务贴合的数据。下面是两张核心表的创建语句一张是用户维表一张是订单事实表。CREATE DATABASE IF NOT EXISTS analysis DEFAULT CHARSET utf8mb4; USE analysis; CREATE TABLE dim_user ( user_id INT PRIMARY KEY, user_name VARCHAR(50), register_date DATE, city VARCHAR(50), channel VARCHAR(20) ); CREATE TABLE fact_order ( order_id BIGINT PRIMARY KEY, user_id INT, product_name VARCHAR(100), category VARCHAR(50), amount DECIMAL(10,2), order_date DATE, status TINYINT COMMENT 1-完成 2-取消 3-退款 ); CREATE INDEX idx_user_id ON fact_order(user_id); CREATE INDEX idx_order_date ON fact_order(order_date);注意fact_order的两个索引一个给关联查询用一个给日期范围统计用。数据分析场景中如果每次报表都要走全表扫描数据量一大就会把 MySQL 拖垮。5. SQL 数据分析核心操作与效果验证5.1 基础聚合统计先跑一个最经典的日销售汇总。这个查询会经常出现在经营报表里。SELECT order_date, COUNT(DISTINCT user_id) AS buy_users, COUNT(order_id) AS order_cnt, SUM(amount) AS gmv, ROUND(SUM(amount) / COUNT(DISTINCT user_id), 2) AS arpu FROM fact_order WHERE status 1 GROUP BY order_date ORDER BY order_date;验证要点结果中buy_users是否小于等于订单数可以快速判断是否有同一用户重复下单。gmv字段可以使用 SUM不需要先查明细再在 Python 里加总。如果这个查询在百万行订单表上跑超过 10 秒需要检查order_date索引是否生效或者考虑按月份做分区表。5.2 留存分析用户留存是业务分析的常用模块核心思路是以用户首次下单日期为锚点看第 N 天还有多少用户继续下单。WITH first_order AS ( SELECT user_id, MIN(order_date) AS first_date FROM fact_order WHERE status 1 GROUP BY user_id ) SELECT DATEDIFF(fo.order_date, f.first_date) AS day_offset, COUNT(DISTINCT f.user_id) AS retained_users FROM first_order f JOIN fact_order fo ON f.user_id fo.user_id WHERE fo.status 1 AND fo.order_date BETWEEN f.first_date AND DATE_ADD(f.first_date, INTERVAL 30 DAY) GROUP BY day_offset ORDER BY day_offset;判断是否成功结果中day_offset 0的行数应该等于首购用户总数day_offset 1表示次日留存day_offset 7表示七日留存。如果某些天没有数据可能是数据样本太少或日期范围过滤错误。5.3 窗口函数实战排名与分层MySQL 8.0 的窗口函数非常适合做排名和分组累计。下面这个例子是每个城市消费金额 Top 10 用户。SELECT city, user_id, total_amount, rank_no FROM ( SELECT u.city, u.user_id, SUM(f.amount) AS total_amount, ROW_NUMBER() OVER (PARTITION BY u.city ORDER BY SUM(f.amount) DESC) AS rank_no FROM fact_order f JOIN dim_user u ON f.user_id u.user_id WHERE f.status 1 GROUP BY u.city, u.user_id ) t WHERE rank_no 10 ORDER BY city, rank_no;这里用到了子查询加ROW_NUMBER()。外层再过滤rank_no 10避免窗口函数和 WHERE 同时出现导致的语法问题。5.4 漏斗转化分析漏斗分析适合注册、下单、支付、复购这类链路。下面用条件聚合统计每个环节的人数。SELECT COUNT(DISTINCT CASE WHEN register_date IS NOT NULL THEN user_id END) AS step_register, COUNT(DISTINCT CASE WHEN first_order_date IS NOT NULL THEN user_id END) AS step_first_order, COUNT(DISTINCT CASE WHEN second_order_date IS NOT NULL THEN user_id END) AS step_second_order FROM ( SELECT u.user_id, u.register_date, MIN(CASE WHEN f.order_date IS NOT NULL THEN f.order_date END) AS first_order_date, MAX(CASE WHEN ord_num 2 THEN order_date END) AS second_order_date FROM dim_user u LEFT JOIN ( SELECT user_id, order_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date) AS ord_num FROM fact_order WHERE status 1 ) f ON u.user_id f.user_id GROUP BY u.user_id, u.register_date ) t;这个查询的难点在于对每个用户找第二次下单时间用窗口函数ROW_NUMBER()给订单编号再判断ord_num 2。整体逻辑清晰可读性也比较好。5.5 存储过程封装分析逻辑当分析逻辑需要反复执行时可以封装成存储过程。下面是一个按月统计 GMV 的过程。DELIMITER // CREATE PROCEDURE sp_monthly_gmv(IN target_month VARCHAR(7)) BEGIN SELECT DATE_FORMAT(order_date, %Y-%m) AS month, COUNT(DISTINCT user_id) AS buy_users, COUNT(order_id) AS order_cnt, SUM(amount) AS gmv FROM fact_order WHERE status 1 AND DATE_FORMAT(order_date, %Y-%m) target_month GROUP BY month; END // DELIMITER ; CALL sp_monthly_gmv(2025-01);注意DELIMITER的切换否则客户端会误把分号当成语句结束。存储过程在实训环境里非常实用可以把重复报表逻辑统一收敛避免多个分析师各写一套 SQL。6. 数据表设计与数据模型实战数据分析架构能不能稳定跑起来一半取决于表设计。下面从分层和建模两个角度展开。6.1 分层设计ODS / DWD / ADS企业级数据分析体系常把数据分成几层。MySQL 实例里也可以在同一个库下通过表名前缀区分ods_原始数据层保存从业务库同步过来的原始快照。dwd_明细数据层完成清洗、去重、标准化之后的事实明细。ads_应用汇总层面向报表和应用查询的汇总结果。例如CREATE TABLE ads_daily_sales ( stat_date DATE PRIMARY KEY, gmv DECIMAL(16,2), order_cnt INT, buyer_cnt INT );这套分层思路并不要求一定要用数仓组件在 MySQL 里用视图和存储过程就可以落地。关键是每一层要有明确的写入节点和负责人避免报表直接面对原始业务表。6.2 事实表和维表拆分上面创建的fact_order是事实表dim_user是维表。事实表负责记录行为维表负责描述属性。分析时通过主键关联。实际业务中还有商品维表、门店维表、日期维表。日期维表经常用来补全缺省日期CREATE TABLE dim_date ( date_key DATE PRIMARY KEY, year_no INT, month_no INT, day_no INT, is_workday TINYINT );日期维表可以先按 10 年范围一次性生成后续报表缺日期就 LEFT JOIN 它天数缺口一眼就能看出来。6.3 分区表处理大日期范围如果订单表数据量增长很快可以按月份做 RANGE 分区。ALTER TABLE fact_order PARTITION BY RANGE (YEAR(order_date) * 100 MONTH(order_date)) ( PARTITION p202501 VALUES LESS THAN (202502), PARTITION p202502 VALUES LESS THAN (202503), PARTITION p202503 VALUES LESS THAN (202504) );分区表在数据分析场景里能明显提升按日期范围查询的速度也能简化历史数据清理直接DROP PARTITION比DELETE删除一个月的海量数据高效得多。不过分区字段必须包含在主键里这是 MySQL 的硬性限制设计表结构时就要考虑进去。6.4 视图用于口径统一企业数据分析里最怕同一个指标在不同报表里算出来不一样。解决办法是定义统一的视图CREATE OR REPLACE VIEW v_gmv_daily AS SELECT order_date, SUM(amount) AS gmv, COUNT(DISTINCT user_id) AS buyer_cnt, COUNT(order_id) AS order_cnt FROM fact_order WHERE status 1 GROUP BY order_date;之后所有报表都从这个视图取数口径就统一了。需要改口径时只改视图定义不用通知所有下游改 SQL。7. 数据导入导出与批量任务流水线7.1 LOAD DATA 批量导入数据分析项目经常需要把 CSV 数据灌进 MySQL。用LOAD DATA比逐条 INSERT 快很多。-- 先在 MySQL 中执行加载指令 LOAD DATA LOCAL INFILE /data/order_202501.csv INTO TABLE fact_order FIELDS TERMINATED BY , ENCLOSED BY LINES TERMINATED BY \n IGNORE 1 ROWS (order_id, user_id, product_name, category, amount, order_date, status) SET order_date STR_TO_DATE(order_date, %Y-%m-%d);使用LOCAL参数时客户端和服务端都要允许 local_infile。如果遇到文件读取权限问题把 CSV 放到 MySQL 用户可读的目录下并检查secure_file_priv配置。7.2 定时任务 Event SchedulerMySQL 自带事件调度器可以定时执行存储过程本质就是数据库内置的批量任务。SET GLOBAL event_scheduler ON; CREATE EVENT IF NOT EXISTS daily_sales_summary ON SCHEDULE EVERY 1 DAY STARTS 2025-01-01 02:00:00 ON COMPLETION PRESERVE DO BEGIN INSERT INTO ads_daily_sales SELECT order_date, SUM(amount), COUNT(*), COUNT(DISTINCT user_id) FROM fact_order WHERE status 1 AND order_date CURDATE() - INTERVAL 1 DAY GROUP BY order_date ON DUPLICATE KEY UPDATE gmv VALUES(gmv), order_cnt VALUES(order_cnt), buyer_cnt VALUES(buyer_cnt); END;注意ON DUPLICATE KEY UPDATE可以保证重复执行时不产生脏数据。7.3 Shell 脚本 crontab 调度如果分析任务还涉及 Python 脚本或数据处理可以交给 crontab 调度。#!/bin/bash # /home/analysis/run_daily.sh export PATH/usr/local/mysql/bin:$PATH cd /home/analysis # 1. 从业务库同步数据到分析库示例生产环境建议使用专用同步工具 mysqldump --single-transaction -ubiz_user -pBizPass biz_db orders | mysql -uanalysis_user -pAnalysisPass analysis_db # 2. 执行月度汇总存储过程 mysql -uanalysis_user -pAnalysisPass -e CALL sp_monthly_gmv(2025-01);crontab 配置0 1 * * * /bin/bash /home/analysis/run_daily.sh /home/analysis/logs/run.log 21写脚本时注意不要把数据库密码直接明文写在脚本里可以放到~/.my.cnf并设置权限为 600或者使用环境变量注入。7.4 Python 连接 MySQL 做后续分析MySQL 承担存储和预聚合Python 承担更灵活的分析和可视化这是目前很主流的分工。import pymysql import pandas as pd conn pymysql.connect( host127.0.0.1, port3306, useranalysis_user, passwordyour_password, databaseanalysis, charsetutf8mb4 ) sql SELECT order_date, gmv, buyer_cnt FROM v_gmv_daily WHERE order_date BETWEEN %s AND %s ORDER BY order_date df pd.read_sql(sql, conn, params(2025-01-01, 2025-01-31)) print(df.head()) # 继续做移动平均或趋势计算 df[gmv_ma7] df[gmv].rolling(7).mean() print(df.tail()) conn.close()这个组合的优势是MySQL 负责快速过滤和聚合Pandas 负责二次加工各用各的长处。8. 性能优化与资源占用观察数据分析场景下MySQL 的瓶颈通常不是 CPU而是磁盘 IO、临时表空间和 SQL 写法。下面按排查顺序讲。8.1 EXPLAIN 看执行计划任何慢查询第一件事就是看执行计划。EXPLAIN SELECT order_date, SUM(amount) FROM fact_order WHERE status 1 GROUP BY order_date;重点看type和rows。如果type是ALL说明全表扫描rows显示的行数越大越危险。针对WHERE和GROUP BY字段建立合适索引后执行计划应该变成ref或range。8.2 慢查询日志在配置文件my.cnf中开启慢查询日志[mysqld] slow_query_logON slow_query_log_file/var/log/mysql/slow.log long_query_time2运行一段时间后查看慢日志mysqldumpslow -s t -t 10 /var/log/mysql/slow.log也可以直接查询 MySQL 内置的慢查询统计视图SELECT SCHEMA_NAME, DIGEST_TEXT, COUNT_STAR, AVG_TIMER_WAIT FROM performance_schema.events_statements_summary_by_digest ORDER BY AVG_TIMER_WAIT DESC LIMIT 10;8.3 SHOW PROCESSLIST 看实时负载报表任务卡住时先看当前有哪些 SQL 在跑SHOW FULL PROCESSLIST;如果很多查询处于Copying to tmp table状态说明临时表空间压力大。大数据量分组排序时可以增大tmp_table_size和max_heap_table_size或者让 SQL 改成先聚合再关联降低临时表大小。8.4 观察资源占用实训环境中推荐用htop看 CPU 和内存用iostat看磁盘 IO用SHOW GLOBAL STATUS看数据库级指标。SHOW GLOBAL STATUS LIKE Created_tmp_disk_tables; SHOW GLOBAL STATUS LIKE Threads_connected;Created_tmp_disk_tables如果一直很大说明很多查询的临时表落盘了性能会明显下滑。可以调整 SQL 减少大字段排序或者增大innodb_buffer_pool_size让更多数据热在内存里。8.5 降低负载的通用手段报表查询走从库或独立分析实例不和生产 OLTP 库混用。高频统计结果写入汇总表查询直接读汇总表。使用索引覆盖减少回表。大查询分批执行避免一次性扫一个月数据。定期归档历史数据事实表只保留热数据窗口。9. 常见问题与排查方法问题现象可能原因排查方式解决方案客户端连接报 Authentication plugin 错误MySQL 8.0 默认使用 caching_sha2_password老客户端不支持查看用户插件类型SELECT plugin FROM mysql.user WHERE userxxx将用户改为 mysql_native_password或升级客户端驱动中文乱码数据库、表、连接字符集不一致SHOW VARIABLES LIKE character%统一设置 utf8mb4连接参数加 charset端口被占用已存在 MySQL 实例或其它服务占用 3306netstat -anpgrep 3306LOAD DATA 报 secure_file_priv 限制服务端限制了导入导出目录SHOW VARIABLES LIKE secure_file_priv把文件放到允许目录或设置 secure_file_priv 为空查询很慢但数据量不大索引失效或 SQL 写法存在隐式转换EXPLAIN 查看执行计划调整索引或修正字段类型存储过程创建报语法错误DELIMITER 没有正确设置检查客户端中 DELIMITER 命令使用 DELIMITER // 包裹过程体Event 不执行event_scheduler 未开启SHOW VARIABLES LIKE event_schedulerSET GLOBAL event_scheduler ON磁盘被 binlog 占满日志保留时间过长SHOW BINARY LOGS查看日志列表设置 expire_logs_days 或 binlog_expire_logs_seconds报表数据重复定时任务重复执行或幂等性不足查任务日志与数据唯一键在 INSERT 中增加 ON DUPLICATE KEY UPDATEPython 连接报 charset 异常连接字符串缺少 utf8mb4检查 Python 端报错信息连接参数增加 charsetutf8mb410. 最佳实践与使用建议10.1 搭建最小可运行分析链路实训环境建议搭建一条最小闭环MySQL 数据入库、SQL 清洗聚合、视图输出报表、定时任务自动维护。整个链路跑通后再逐步扩展 Python 分析和 BI 展示。不要一开始就上大数据组件MySQL 能把业务分析跑明白才是核心。10.2 数据质量校验前置写入和计算过程都要考虑数据质量事实表必须保证订单号唯一定期检查主键冲突。金额字段使用DECIMAL不要用FLOAT。日期字段统一格式建议使用 DATE 类型。做数据同步时加上时间戳字段etl_time方便排查数据延迟。报表调度失败时要有日志和告警不能静默失败。10.3 权限与安全分析账号不要直接使用 root创建专用账号并限制权限CREATE USER analysis_user% IDENTIFIED BY strong_password; GRANT SELECT, INSERT, UPDATE, DELETE ON analysis.* TO analysis_user%;如果只是报表查询只给 SELECT 权限。接口服务或批量任务专用账号也不要拥有 DROP、ALTER 权限。生产环境避免使用%这种全区段开放方式应限制访问来源 IP。10.4 目录规范建议实训项目里按下面结构组织analysis/ ├── sql/ # 建表、存储过程、视图脚本 ├── data/ # 样例数据 CSV ├── scripts/ # Python 与 Shell 脚本 ├── logs/ # 日志 └── reports/ # 报表输出10.5 自动化任务要注意幂等性批量任务尽量设计成可重复执行。典型的做法是先删除目标时间段的数据再重新写入或者使用INSERT ... ON DUPLICATE KEY UPDATE。否则任务重跑一次报表数据就翻倍。10.6 合规使用数据实训环境和企业内部分析要关注数据授权与隐私保护。不要用真实用户信息做公开案例不要在生产库上执行未经评审的批量更新。涉及第三方数据时以脱敏后的样例数据为准。11. 总结与下一步这套基于 MySQL 的数据分析架构核心价值在于用最低的成本解决大量实际分析问题。不需要一开始就上 Spark、Hive 或 ClickHouse先把 SQL 聚合、窗口函数、存储过程调度、分层建模这些能力练到位Mid 规模的数据分析场景已经能覆盖大部分。最先应该验证的功能是从一份订单表出发用 SQL 完成日销售汇总、用户留存和 RFM 分层三个分析确认结果与业务常识一致。最容易踩的坑是字符集不统一、自动任务重复写入、索引缺失导致慢查询。建议先在测试环境把这三件事跑通再上生产。后续可以继续扩展的方向包括用 Python Pandas 做更复杂的分析并把结果回写到 MySQL。接 BI 工具让业务人员直接看看板。把 MySQL 作为数仓的落地存储上层挂 Trino 或 Presto 做联邦查询。数据量增长后再把明细层迁移到 ClickHouse 或 DorisMySQL 保留汇总层和指标口径层。这套架构最大的优势是路没有走死。MySQL 可以作为起点也可以作为整个分析体系的底座长期存在。实训阶段把 SQL 分析和数据建模的基本功打牢后面切换到任何 OLAP 组件都会快很多。建议收藏备用按文章顺序从环境准备开始跑一遍。
返回列表