面對單機十億級資料量,傳統「全量索引、單表查詢」模式難以支撐毫秒級響應。本文分享實戰驗證的核心設計思想:只查必要表、只建必要索引、動態拼接 SQL,配合資訊庫元數據過濾無效表,在普通筆電環境 (i7-4700, 8G RAM, USB3.0 2TB HDD) 實測 20 億資料查詢 1~3 秒完成。
information_schema.statistics 判斷哪些表擁有目標欄位索引,僅對這些表發起查詢並 UNION ALL 合併結果。假設兩表 A、B 結構相同,但資料互補:
username 非空、email 為空email 非空、username 為空password 皆非空索引策略:
password 索引username 索引,不建 email 索引email 索引,不建 username 索引SELECT TABLE_NAME
FROM information_schema.statistics
WHERE INDEX_NAME != 'PRIMARY'
AND table_schema = 'info'
AND COLUMN_NAME = 'email'
GROUP BY TABLE_NAME;
應用層獲取表名列表後,動態生成:
SELECT * FROM `B` WHERE `email` = 'root@cnseay.com';
-- 僅查擁有 email 索引的表,自動跳過 A 表
innodb_buffer_pool_size 設物理記憶體 60-70%,innodb_flush_log_at_trx_commit=2 (非核心業務)SELECT *,只取必要欄位減少 I/O。COUNT(*) 極慢,改用近似值或單獨統計表。ANALYZE TABLE 更新統計資訊,確保優化器選擇正確執行計畫。此架構在「查詢為主、寫入可控、資料可按業務維度自然分片」的場景效果顯著。若寫入極高或需強一致跨表事務,需引入分散式中間件或 NewSQL 方案。