慣性聚合 関心のあるブログ、ニュース、テクノロジーを効率的に追跡
原文を読む 慣性聚合で開く

おすすめ購読元

博客园 - 司徒正美
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. インナボーンハイアラーシ(バイトからテーブルスペースへ)

MySQLのデフォルトエンジンであるInnoDBは、高速性、マルチユーザー正確性、重い読み書きトラフィックに対応して設計されています。それは単に生のテキスト文字列をファイルに追記するだけではありません。高度に構造化された厳格なマルチレベルの階層を通じてデータを管理します.

ストレージスタック

  • テーブルスペース: これは最高の論理コンテナです。モダンな設定(例えば)を有効にした場合innodb_file_per_table、各々のデータベーステーブルはハードドライブ上に独自の物理.ibdファイルを持っています。
  • 拡張子: テーブルをドライブの異なる物理セクタに散らばらせないように、InnoDBは拡張子と呼ばれるチャンクでスペースを割り当てます。各拡張子は正確に1メガバイトです。 のサイズで複数の連続ページをまとめ、順次データが物理的にディスク上で近くに留まることを保証します。
  • ページ: では、Page がInnoDBが実際に作業を行う基本的な原子単位です。デフォルトでは、InnoDBページは正確に16キロバイトです。InnoDBがデータを読み書きするたびに、それをロードします。16KBページ全体をサーバーのRAM(バッファプール)にロードする場合、たとえ単一の行だけを要求したとしても
  • 行: この構造の絶対的な基盤には個々の行があり、データページ内に緊密に詰め込まれています。InnoDBはクラスタインデックスB+木を使用しているため、あなたの行は物理的にプライマリキーでソートされ、ディスク上に格納されます。

2. アーカイブエンジン(アンチページアプローチ)

データを更新する必要がない場合、どうすればいいでしょうか?システムログ、クリックストリーム、または何か問題が発生したときにだけ確認する数十億ものア auditr ーを保管している場合、どうすればいいでしょうか?

それを InnoDB に投入することは非常に無駄です。インデックスツリーと 16KB ページ構造がディスク使用量を増加させるからです。The ARCHIVE engineは、この正確な問題を解決するために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では単一のパーティション化されたテーブル内でストレージエンジンを混在させることができないため、パーティション交換という戦略を使用します。これはメタデータのみのスワップで、数百万行を1秒未満で転送します.

ステップ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. 生産現実の確認:業界の現在の状況

パーティション交換が実際に生産で使用されているか?はい、毎日1日中。 ライブテーブルをロックせずに歴史データをドロップまたは隔離するための金の標準です。

しかし、ARCHIVEエンジンはストリーム圧縮のための素晴らしいアーキテクチャブループリントであるが、現代のクラウドインフラチームは通常「冷蔵」階層化を異なる方法で処理しています。今日、プロダクションデータベースストレージとIOPS(1秒あたりの入出力操作数)は非常に高価です。エンジニアは、圧縮されていても、冷蔵の歴史的なログデータが同じライブプロダクションデータベースインスタンスに置かれるのを望みません。

代わりに、企業はデータパーティション交換を使用して古いデータをステージングテーブルに隔離し、MySQLから完全にストリーミングして、超圧縮の列形式のApache Parquetファイルとしてクラウドデータレイク(AWS S3など)にフォーマットし、その後ステージングテーブルを完全に削除します。これにより、ライブプロダクションデータベースがスリーン、速く、運用コストも驚くほど安くなります。


結論

サイドプロジェクトを構築している場合やソフトウェアエンジニアリングコースを進めている場合、標準的なデータベース設定にデフォルト設定にするのが簡単です。しかし、内部を見ることでアプリケーションのパフォーマンスに取り組む方法が変わります。

InnoDBの厳格なページ割り当てとARCHIVEの流動的な圧縮ストリームの間の緊張関係を理解することは、データアクセスパターンを批判的に考えるのに役立ちます - 適切なストレージ戦略を適切なワークロードに合わせることは、標準的なCRUDアプリケーションを書くだけでなく、最適化された、本番用のシステムをエンジニアリングする方法です。