【網站架構】隨著新創產品的成功,會員數與流量呈爆炸性成長,這原本是令人振奮的好消息。然而,許多技術團隊很快就會發現,原本運作順暢的網站開始變慢,甚至在尖峰時刻直接掛點。追查原因後往往會發現,資料庫 (Database) 成為了效能的瓶頸。根據 Google 的研究統計,當頁面載入時間超過 3 秒,高達 53% 的行動用戶會選擇離開。如何設計一個能夠彈性擴展、支撐高併發的資料庫架構,成為了 CTO 與系統架構師必須面對的挑戰。
為什麼資料庫會成為瓶頸?
在網站發展初期,使用單一資料庫(Single Point)是最簡單且高效的選擇。開發快速、維護容易。但隨著使用者增加,單一伺服器的 CPU、記憶體與 I/O 吞吐量終將達到物理極限。
面對效能問題,我們通常有兩種解法:
- 垂直擴展 (Vertical Scaling):「加錢換效能」,升級 CPU、加大記憶體、換更快的 NVMe SSD。這方法簡單暴力,但硬體有上限,且成本呈指數級上升。
- 水平擴展 (Horizontal Scaling):「架構換效能」,透過增加伺服器數量來分攤流量。這是高流量網站的長久之計。
以下我們將探討從單機到分散式架構的三個關鍵擴展策略。
策略一:讀寫分離 (Read/Write Splitting)
絕大多數的網站應用場景都是符合「讀多寫少」的特性。例如新聞網站、部落格、電商商品頁,瀏覽(讀取)的次數遠大於發布或修改(寫入)的次數,比例往往在 10:1 甚至 100:1 以上。
運作原理
利用資料庫內建的複製 (Replication) 功能,建立主從式架構 (Master-Slave Architecture):
- Master (主庫):負責處理所有的寫入 (INSERT, UPDATE, DELETE) 操作。
- Slave (從庫):負責處理所有的讀取 (SELECT) 操作。資料會從 Master 非同步同步複製到 Slave。
透過這種架構,我們可以透過增加 Slave 節點來線性提升讀取效能。搭配 Middleware (如 MySQL Proxy, ProxySQL) 或應用層的路由機制,自動將查詢導向 Slave。
潛在挑戰
主從延遲 (Replication Lag):由於資料複製需要時間,可能發生使用者剛修改完資料(寫入 Master),立刻重新整理頁面(讀取 Slave)卻看到舊資料的情況。解決方案通常是在寫入後的極短時間內強制讀取 Master,或在架構上容許「最終一致性」。
策略二:快取機制 (Caching)
資料庫的磁碟 I/O 是系統中最慢且最昂貴的操作。為了保護脆弱的資料庫,最有效的防禦手段就是「不要讓請求打到資料庫」。這時我們需要引入快取層(如 Redis 或 Memcached)。
關鍵思維:二八法則與熱點資料
通常 80% 的流量只集中在 20% 的熱門資料上(如首頁文章列表、熱銷商品資訊、使用者 Session)。我們將這些 KV (Key-Value) 結構的資料放入讀寫速度極快的記憶體快取中。
- Cache Hit (快取命中):直接從記憶體回傳資料,速度極快(毫秒級),不再存取 DB。
- Cache Miss (快取未命中):快取沒資料才去查資料庫,並將結果回寫到快取中,供下次使用。
快取設計的陷阱
- 快取穿透:查詢不存在的資料,導致請求每次都穿過快取直接打擊資料庫。解法:對空結果也進行短暫快取。
- 快取雪崩:大量快取在同一時間過期,導致瞬間流量全部壓垮資料庫。解法:將過期時間 (TTL) 加上隨機值。
策略三:分庫分表 (Sharding)
當資料量達到數千萬甚至上億筆,單一張資料表的索引會變得極大,查詢效能急劇下降;且單一 Master 即便只處理寫入,I/O 與連接數也可能撐不住。這時就需要使用「分庫分表」。
垂直拆分 (Vertical Sharding)
依照「業務功能」拆分。例如將電商系統拆分為「使用者資料庫」、「訂單資料庫」、「商品資料庫」。這通常是微服務架構的第一步。雖然解決了單一 DB 的壓力,但無法解決單一業務表過大的問題。
水平拆分 (Horizontal Sharding)
這才是真正的 Sharding。將一張超大資料表,依照特定的規則(Sharding Key,例如 User ID)拆分成多張小表,分散存在不同的資料庫伺服器中。
- 範例:User ID 為偶數存放在 DB_A,奇數存放在 DB_B。
- 優勢:理論上容量與寫入效能可以無限擴展。
代價與挑戰
Sharding 是解決海量數據的終極手段,但也帶來了極高的開發與維護複雜度:
- 跨庫 JOIN 困難:資料分散在不同機器,無法直接做關聯查詢。
- 分散式事務 (Distributed Transaction):如何確保跨庫操作的原子性(要么全成功,要么全失敗)?通常需引入 TCC 或 Saga 模式。
- 唯一 ID 生成:無法再使用資料庫的 Auto Increment ID,需改用 Snowflake (雪花演算法) 或 UUID。
總結:架構是演進出來的
知名架構師曾說:「過早的優化是萬惡之源。」沒有一套架構是完美的,只有最適合當下的設計。新創團隊不應在一開始會員只有幾百人時,就追求淘寶等級的複雜分庫架構,這只會拖慢開發速度。
正確的思維應該是漸進式演進:
- 單機資料庫 (做好索引優化)
- 讀寫分離 (解決讀取壓力)
- 引入快取 (解決熱點流量)
- 分庫分表 (解決海量數據與寫入瓶頸)
唯有理解每個階段的痛點與解法,才能設計出既穩健又能隨著業務成長的優良架構。
參考資料:High Scalability, System Design Primer, AWS Architecture Blog

上一篇文章標題
下一篇文章標題
分享文章
文章資訊
發布日期
2026-01-17
瀏覽次數
88
相關文章
不懂程式也能做網頁?一表看懂網頁設計與開發的本質區別
轉單率提升 200%!成功的網頁設計必須具備的 10 個心理學技巧
企業官網設計清單:掌握這 5 點,讓你的網站變成 24 小時業務員
【AI設計】Claude Code 真的很醜嗎?深度評測其設計風格與高品質網頁產出技巧