Files
ewoooc/docs/DATABASE_OPTIMIZATION_GUIDE.md
ogt 1b4f3a7bbe
Some checks failed
CD Pipeline / deploy (push) Failing after 59s
feat: EwoooC 初始化 — 完整專案推版至 Gitea
- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml)
- 部署模式: rsync Python 檔案至 188 → docker restart (volume mount)
- Dockerfile/requirements 變動時自動重建 Docker image
- 部署通知: Telegram (開始/成功/失敗)
- 健康檢查: https://mo.wooo.work/health (最多 5 次重試)
- 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 01:21:13 +08:00

4.7 KiB
Raw Permalink Blame History

SQLite 資料庫優化指南

創建日期2026-01-14 執行時機:晚上 8 點後(低流量時段)


📋 優化內容

1. 添加索引(總計 8 個)

products 表

  • idx_products_category - 分類查詢優化
  • idx_products_status - 狀態篩選優化
  • idx_products_updated_at - 更新時間排序優化

price_records 表

  • idx_price_records_product_id - 商品價格歷史查詢
  • idx_price_records_product_time - 複合索引(商品+時間)

promo_products 表

  • idx_promo_crawled_at - 爬取時間查詢
  • idx_promo_batch_id - 批次查詢
  • idx_promo_status_change - 狀態變更篩選

2. VACUUM 清理

  • 回收已刪除資料的空間
  • 優化資料庫內部結構
  • 預計可節省 5-10% 空間

3. ANALYZE 統計

  • 更新查詢規劃器統計資訊
  • 提升查詢效能

執行時間建議

最佳執行時間:晚上 8:00 - 凌晨 2:00

預計耗時

  • 添加索引1-2 分鐘
  • VACUUM 清理30-60 秒
  • 總計:約 2-3 分鐘

影響範圍

  • ⚠️ 添加索引期間該表寫入會被阻塞1-10 秒/索引)
  • 🚨 VACUUM 期間整個資料庫無法讀寫30-60 秒)

🚀 執行方式

方式一:手動執行(推薦)

1. SSH 連線到伺服器

gcloud compute ssh momo-server --zone=asia-east1-a

2. 進入專案目錄

cd ~/momo_pro_system

3. 執行優化腳本

python3 database_optimization.py

4. 觀察執行過程

腳本會即時顯示進度:

[2026-01-14 20:00:15] [INFO] SQLite 資料庫優化腳本啟動
[2026-01-14 20:00:15] [INFO] 當前資料庫大小: 208.45 MB
[2026-01-14 20:00:15] [INFO] 步驟 1/3: 添加索引
[2026-01-14 20:00:16] [SUCCESS] ✓ 索引創建成功: idx_products_category (耗時 0.35 秒)
...
[2026-01-14 20:02:30] [SUCCESS] ✓ 資料庫優化完成!

方式二:使用 screen 背景執行

如果擔心 SSH 斷線,可以使用 screen

# 1. SSH 連線
gcloud compute ssh momo-server --zone=asia-east1-a

# 2. 創建 screen 會話
screen -S db_optimization

# 3. 執行腳本
cd ~/momo_pro_system
python3 database_optimization.py

# 4. 離開 screen按 Ctrl+A 然後按 D
# 腳本會繼續在背景執行

# 5. 重新連接 screen 查看進度
screen -r db_optimization

方式三:定時任務(自動執行)

如果想要自動在每週日凌晨執行:

# 編輯 crontab
crontab -e

# 添加以下行(每週日凌晨 2:00 執行)
0 2 * * 0 cd /home/ogt/momo_pro_system && /usr/bin/python3 database_optimization.py >> logs/db_optimization.log 2>&1

執行後驗證

1. 檢查索引是否創建成功

sqlite3 data/momo_database.db "SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_%';"

應該看到 8 個新索引。

2. 檢查資料庫大小

ls -lh data/momo_database.db

如果執行了 VACUUM大小應該會略微減少。

3. 測試網站運行

訪問 https://momo.wooo.work/,確認商品列表載入正常


📊 預期效果

查詢效能提升

  • 分類篩選:快 50-80%
  • 價格歷史查詢:快 70-90%
  • 促銷商品查詢:快 60-80%

空間節省

  • 預計節省10-20 MB
  • 資料庫結構更緊湊

⚠️ 注意事項

  1. 執行前備份(可選,但建議)

    cp data/momo_database.db data/momo_database_backup_$(date +%Y%m%d).db
    
  2. 確認服務運行正常

    systemctl status momo
    
  3. 執行期間避免

    • 不要手動觸發爬蟲任務
    • 不要進行大量資料匯入
    • 不要重啟服務
  4. 執行後檢查日誌

    tail -100 logs/gunicorn-error.log
    

🆘 問題排查

問題 1資料庫被鎖定

錯誤database is locked

原因:有其他程序正在使用資料庫

解決

# 檢查是否有爬蟲程序在運行
ps aux | grep python | grep -E 'crawler|scheduler'

# 如果有,先停止
pkill -f 'run_scheduler.py'

問題 2VACUUM 執行時間過長

現象:超過 5 分鐘還在執行

解決

  • 正常情況,耐心等待
  • 不要中斷程序Ctrl+C
  • 如果超過 10 分鐘,可能需要檢查磁碟空間

問題 3執行後網站載入變慢

可能原因SQLite 緩存尚未建立

解決

  • 等待 5-10 分鐘,讓系統重新建立緩存
  • 或手動刷新幾次頁面

📞 聯絡支援

如有問題,請檢查:

  1. 執行腳本的完整輸出
  2. Gunicorn 錯誤日誌:logs/gunicorn-error.log
  3. 系統負載:uptime

文件版本1.0 最後更新2026-01-14 維護人員MOMO Pro System Admin