慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
引擎下方:解釋資料庫內部機制 (InnoDB 與 ARCHIVE)
Tejas · 2026-05-24 · via DEV Community

大多開發者將資料庫引擎視為黑箱:你寫一個查詢,資料就神奇地回傳。但當資料規模擴展到數百萬行時,了解資料實際存放於物理硬體上的方式,會改變你建構系統的方法。

如果你將每一個單一的資料片段都丟入你的預設資料庫設定,你的儲存成本最終會飆升,而你的查詢速度將變慢。

要建立可擴展的系統,你需要了解兩種完全相反的儲存哲學:頁基交易式儲存 (InnoDB) 和 串流壓縮式儲存 (ARCHIVE),以及它們如何透過 表格分割 連接起來.


1. InnoDB 層級結構 (從位元組到表空間)

MySQL 的預設引擎 InnoDB 是為速度、多使用者精確性以及高讀寫流量而設計的。它不僅僅是將原始文字字串附加到檔案中。它透過高度結構化的嚴格多層級架構來管理資料.

儲存堆疊

  • 資料庫區塊: 這是最高層級的邏輯容器。當你開啟現代設定時,例如innodb_file_per_table,每一個資料庫表格都在您的硬碟上獲得一個獨立的物理.ibd檔案。
  • 範圍: 為了防止您的作業系統的檔案系統將您的表格分佈在不同的硬碟物理扇區上,InnoDB 分配空間的單位稱為範圍。每一個範圍都是確切1 百萬位元組。 在大小上,並將多頁連續頁面綁定在一起,確保順序數據在硬碟上保持物理上的接近.
  • 頁面: The 頁面 是 InnoDB 执行實際工作的核心原子單位。默認情況下,一個 InnoDB 頁面確切是 16 Kilobytes。無論 InnoDB 讀取或寫入數據,它都會載入將整個 16KB 頁面載入至您的伺服器記憶體(緩衝池)中,即使您僅請求單一列
  • 列數: 這個結構的最基礎是單個列,緊密地打包在資料頁面內。由於 InnoDB 使用一個聚集索引 B+樹,您的列在磁碟上是以其主鍵物理排序和儲存的。

2. 档案引擎 (反頁面方法)

如果你不需要更新資料?如果你正在儲存數以億計的系統日誌、點擊流或審計軌跡,而你只在你們看它們時才查看?

將這些放入 InnoDB 是極度浪費,因為索引樹和 16KB 頁面結構會使你的磁碟使用量膨脹。ARCHIVE 引擎 完全顛覆了 InnoDB 的設計來解決這個精確問題:

  • 無固定頁面: 而不是將數據結構化為嚴格的 16KB 块,ARCHIVE 將您的數據視為一個連續的、無界的 僅追加二進制字節流,並儲存在一個 .arz 檔案內。
  • 即時流壓縮: 當資料被插入時,它會通過一個記憶體內壓縮緩衝區。尾隨空格被移除,並由一個優化的位元頭處理 NULL 值。原始資料行隨後會使用 zlib 算法在即時壓縮,然後才寫入磁碟。
  • 索引的取捨: 為了維持其微小的佔用空間,ARCHIVE 允許 零個次要索引。唯一允許的索引是一個 AUTO_INCREMENT 欄位。

因為它作為一個原始壓縮的文本字串,而不是索引的區塊結構,所以 ARCHIVE 通常達到 3:1 到 10:1 的壓縮比例,相較於 InnoDB。


3. 架構比較矩陣

架構特性 InnoDB 引擎 檔案庫引擎
儲存佈局 嚴格 16KB 頁面 / 1MB 擴展 連續zlib壓縮的字節流
主要檔案格式 .ibd (資料 + 索引合併) .arz (資料) + .frm (元資料)
寫入模型 B+樹插入,頁面分割 透過記憶體緩衝區的僅添加流
支援的變更 INSERTSELECTUPDATEDELETE INSERTSELECT僅 (WORM 模式)
鎖定機制 細粒度行鎖定 (MVCC) 交錯行流鎖定

4. 連接世界:表格分割& 交換

既然你已了解這兩種引擎,你可以將這些心智模型組合起來,形成一個 熱/冷數據層級系統。目標很簡單:將近期數據(熱)保留在 InnoDB 中,以便能夠快速更新和建立索引。將較舊數據(冷)移至替代儲存,以佔用較少的磁碟空間。

由於 MySQL 不允許您在單個分區表中混合儲存引擎,我們使用一種稱為 分區交換的策略。這是一種僅涉及元數據的交換,可以在不到一秒鐘內轉移數百萬行數據.

步驟 A:建立分區的 InnoDB 表

我們使用時間戳或日期按月份對一個活動的 InnoDB 表進行分區:

CREATE TABLE system_logs (
    log_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    log_date DATE NOT NULL,
    subsystem VARCHAR(50) NOT NULL,
    message TEXT NOT NULL,
    PRIMARY KEY (log_id, log_date)
) ENGINE=InnoDB
PARTITION BY RANGE (TO_DAYS(log_date)) (
    PARTITION p_past_month VALUES LESS THAN (TO_DAYS('2026-05-01')),
    PARTITION p_current_month VALUES LESS THAN (TO_DAYS('2026-06-01')),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);

進入全螢幕模式 離開全螢幕模式

步驟 B:即時分區交換

當一個月結束時,您想要壓縮那較舊的數據。執行一個龐大的 DELETE 語句會鎖定您的表格並使您的 CPU 峰值。相反地,您建立一個空的、相同的 InnoDB 簡易表,並立即交換舊的分區:

-- 1. Create a temporary staging table matching the schema
CREATE TABLE system_logs_stage LIKE system_logs;
ALTER TABLE system_logs_stage REMOVE PARTITIONING;

-- 2. Instantly swap the old partition into the staging table (Takes < 1 second)
ALTER TABLE system_logs EXCHANGE PARTITION p_past_month WITH TABLE system_logs_stage;

-- 3. Drop the now empty partition from the active table
ALTER TABLE system_logs DROP PARTITION p_past_month;

進入全螢幕模式 退出全螢幕模式

從這裡,您可以將system_logs_stage的內容直接輸入到以ARCHIVE為後端表格中,以在數據庫中原生壓縮您的冷日誌


5. 生產現實檢查:行業目前的狀況

分割交換實際上在生產中真的使用嗎?是的,每天每個時刻。 它是下載或隔離歷史數據而不鎖定您的即時表的黃金標準。

然而,儘管 ARCHIVE 引擎是流壓縮的壯觀架構藍圖,現代雲基礎設施團隊通常以不同的方式處理「冷」層級。如今,生產數據庫存儲和 IOPS(每秒輸入/輸出操作次數)非常昂貴。工程師不希望冷、歷史性的日誌數據位於同一個活躍的生產數據庫實例上,即使它是壓縮的。

相反,公司會使用分割交換將舊數據隔離到一個暫存表中,將其完全從 MySQL 流出至雲端數據湖(如 AWS S3)中,格式化為超壓縮列式Apache Parquet檔案,然後完全刪除暫存表。這能夠保持生產環境數據庫輕巧、快速,並且運行成本極低。


結論

當你正在建立副業專案或透過軟體工程課程時,很容易就選擇標準的資料庫設定。但深入了解底層會改變你對應用程式效能的處理方式。

理解 InnoDB 僵硬的頁面分配與 ARCHIVE 流動壓縮流之間的張力,能幫助你批判性地思考資料存取模式 - 將正確的儲存策略匹配到正確的任務負載,就是從僅僅編寫標準 CRUD 應用轉變為工程優化、生產就緒系統的方法。