雖然 MySQL 支援 BLOB/TEXT 類型,但將特定類型資料直接存入資料庫往往是架構反模式。本文剖析三類「禁忌資料」的危害與正確替代方案。
CREATE TABLE documents (
id INT PRIMARY KEY,
file_content LONGBLOB -- 直接存 PDF、圖片、Word
);
CREATE TABLE documents (
id INT PRIMARY KEY,
file_path VARCHAR(500) NOT NULL, -- 相對路徑或 S3 Key
file_size BIGINT,
mime_type VARCHAR(100),
storage_type ENUM('local','s3','oss') DEFAULT 's3'
);
建立資料表,寫入後用 cron 定時 DELETE WHERE created_at < NOW() - INTERVAL 1 HOUR 清理。
OPTIMIZE TABLE 整理,鎖表風險高| 資料類型 | 推薦工具 | 核心優勢 |
|---|---|---|
| 指標/統計/監控 | Prometheus + Grafana / InfluxDB / TimescaleDB | 時間序列壓縮、自動保留策略、高效聚合查詢 |
| Session / 快取 | Redis / Memcached / KeyDB | 記憶體級延遲、原生 TTL 過期、集群擴展 |
| 事件流/日誌/追蹤 | Apache Kafka / Pulsar / ClickHouse | 高吞寫入、順序保證、可重放、列式壓縮 |
| GPS/物聯網遙測 | InfluxDB / TimescaleDB / MongoDB | 地理空間索引、高寫入、資料保留自動化 |
CREATE TABLE app_logs (
id BIGINT AUTO_INCREMENT,
level VARCHAR(10),
message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Application → Stdout/Filebeat/Fluentd → Kafka/Logstash → Elasticsearch/Splunk/Datadog/Loki
↓
Local rotating files (fallback)
資料庫擅長:關聯查詢、ACID 事務、結構化業務資料
資料庫不擅長:大二進制、高頻時間序列、非結構化日誌、臨時快取
「用挖土機在後花園種馬鈴薯雖然可行,但拿把鏟子更快、更省油、不傷草皮。」