在 MySQL 儲存引擎開發中,info() 函數是儲存引擎與查詢最佳化器溝通的關鍵橋樑。本文詳細說明其呼叫時機、回傳機制、核心屬性填寫規則,以及對 SHOW TABLE STATUS 的影響。
info() 取得統計資訊。info() 返回後,最佳化器直接讀取這些屬性。SHOW TABLE STATUS 顯示。定義於 sql/handler.h,常用屬性如下:
| 屬性 | 說明 |
|---|---|
ulonglong data_file_length | 資料檔案長度 |
ulonglong max_data_file_length | 資料檔案最大長度 |
ulonglong index_file_length | 索引檔案長度 |
ulonglong max_index_file_length | 索引檔案最大長度 |
ulonglong delete_length | 可重複使用空間 |
ulonglong auto_increment_value | 下一個 AUTO_INCREMENT 值 |
ha_rows records | 表格記錄數(最關鍵) |
ha_rows deleted | 已刪除記錄數 |
ulong raid_chunksize | RAID 區塊大小 |
ulong mean_rec_length | 平均實體記錄長度 |
time_t create_time | 建立時間 |
time_t check_time | 最後檢查時間 |
time_t update_time | 最後更新時間 |
records 指出表格大致行數,最佳化器據此選擇執行計畫:
開發鐵則: 若掃描前無法確知確切行數(如資料由外部填充),必須回傳 ≥ 2,避免最佳化器誤判導致效能退化。
info() 中依實際儲存狀態精確填寫各屬性。records、data_file_length、index_file_length、auto_increment_value。update_time、check_time 正確反映狀態。掌握 info() 機制,能讓自訂儲存引擎在 MySQL 最佳化器中獲得最佳執行計畫,釋放查詢效能潛力。