# 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 連線到伺服器
```bash
gcloud compute ssh momo-server --zone=asia-east1-a
```

#### 2. 進入專案目錄
```bash
cd ~/momo_pro_system
```

#### 3. 執行優化腳本
```bash
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：

```bash
# 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
```

---

### 方式三：定時任務（自動執行）

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

```bash
# 編輯 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. 檢查索引是否創建成功
```bash
sqlite3 data/momo_database.db "SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_%';"
```

應該看到 8 個新索引。

### 2. 檢查資料庫大小
```bash
ls -lh data/momo_database.db
```

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

### 3. 測試網站運行
訪問 https://momo.wooo.work/，確認商品列表載入正常。

---

## 📊 預期效果

### 查詢效能提升
- **分類篩選**：快 50-80%
- **價格歷史查詢**：快 70-90%
- **促銷商品查詢**：快 60-80%

### 空間節省
- 預計節省：10-20 MB
- 資料庫結構更緊湊

---

## ⚠️ 注意事項

1. **執行前備份**（可選，但建議）
   ```bash
   cp data/momo_database.db data/momo_database_backup_$(date +%Y%m%d).db
   ```

2. **確認服務運行正常**
   ```bash
   systemctl status momo
   ```

3. **執行期間避免**：
   - ❌ 不要手動觸發爬蟲任務
   - ❌ 不要進行大量資料匯入
   - ❌ 不要重啟服務

4. **執行後檢查日誌**
   ```bash
   tail -100 logs/gunicorn-error.log
   ```

---

## 🆘 問題排查

### 問題 1：資料庫被鎖定
**錯誤**：`database is locked`

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

**解決**：
```bash
# 檢查是否有爬蟲程序在運行
ps aux | grep python | grep -E 'crawler|scheduler'

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

### 問題 2：VACUUM 執行時間過長
**現象**：超過 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
