首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 儲存引擎 info() 函數實作指南:優化器統計屬性、SHOW TABLE STATUS 支援與記錄數關鍵性

     編輯:MySQL 資料庫相關知識

呼叫時機

  • 表掃描前,優化器呼叫 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 為 0SHOW 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、標記時間戳。現代引擎開發應同步實作持久化統計介面,確保重啟後優化器即刻擁有高質量統計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved