呼叫時機
- 表掃描前,優化器呼叫
info() 獲取統計資訊。
SHOW TABLE STATUS 同樣觸發 info() 刷新顯示資料。
核心屬性填寫 (handler 類別公共屬性)
| 屬性 | 含義 | 關鍵性 |
| records | 表記錄數 (ha_rows) | ⭐⭐⭐⭐⭐ 優化器據此決定掃描策略 |
| deleted | 已刪除記錄數 | ⭐⭐⭐ |
| data_file_length | 資料檔長度 | ⭐⭐⭐ |
| index_file_length | 索引檔長度 | ⭐⭐⭐ |
| delete_length | 可重用空間 (碎片) | ⭐⭐ |
| auto_increment_value | 下一個自增值 | ⭐⭐ |
| mean_rec_length | 平均記錄長度 | ⭐⭐⭐ |
| create_time / update_time / check_time | 時間戳 | ⭐ |
records 屬性特殊邏輯
- 優化器對
records = 0、records = 1、records >= 2 三區間採用不同執行計畫。
- 若儲存引擎無法精確得知行數 (外部資料源、動態生成),必須回傳 >= 2,避免優化器誤判為常數表導致錯誤計畫。
實作範例 (C++)
int ha_myengine::info(uint flag)
{
// 計算或獲取統計
stats.records = get_row_count();
stats.deleted = get_deleted_count();
stats.data_file_length = get_data_size();
stats.index_file_length = get_index_size();
stats.mean_rec_length = stats.records ? stats.data_file_length / stats.records : 0;
stats.auto_increment_value = get_next_auto_inc();
stats.create_time = table_created_time;
stats.update_time = last_modified_time;
stats.check_time = last_check_time;
return 0;
}
常見錯誤與影響
| 錯誤 | 後果 |
| records 固定回傳 0 | 優化器視為空表,可能選擇錯誤連接順序、跳過索引 |
| data_file_length 為 0 | SHOW TABLE STATUS 顯示 0 Bytes,備份工具誤判 |
| 未實作 info() | 預設 0 值,所有統計失效 |
現代替代:Information Schema + 持久化統計
- InnoDB 5.6+:
innodb_stats_persistent=ON,統計寫入磁碟,重啟不丟失。
ANALYZE TABLE 觸發統計採樣更新。
- 自定義引擎建議實作
info() 並同步支援 INFORMATION_SCHEMA.TABLES 欄位。
結語
info() 是儲存引擎與優化器的統計資訊契約。核心義務:精確回傳 records、合理估算 data/index length、標記時間戳。現代引擎開發應同步實作持久化統計介面,確保重啟後優化器即刻擁有高質量統計。