文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man 頁面 (TGZ) - 258.5Kb
Man 頁面 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  估算 InnoDB 表格的 ANALYZE TABLE 複雜度

17.8.10.3 估算 InnoDB 表格的 ANALYZE TABLE 複雜度

針對 InnoDB 表格的 ANALYZE TABLE 複雜度取決於

  • 取樣的頁面數量,由 innodb_stats_persistent_sample_pages 定義。

  • 表格中索引的資料行數量

  • 分割區數量。如果表格沒有分割區,則分割區數量會被視為 1。

使用這些參數,用於估算 ANALYZE TABLE 複雜度的近似公式會是

innodb_stats_persistent_sample_pages 的值 * 表格中索引的資料行數量 * 分割區的數量

通常,結果值越大,ANALYZE TABLE 的執行時間就越長。

注意

innodb_stats_persistent_sample_pages 定義了在全域層級取樣的頁面數量。若要設定個別表格取樣的頁面數量,請搭配 CREATE TABLEALTER TABLE 使用 STATS_SAMPLE_PAGES 選項。如需更多資訊,請參閱 第 17.8.10.1 節,「設定持續性最佳化工具統計資料參數」

如果 innodb_stats_persistent=OFF,則取樣的頁面數量由 innodb_stats_transient_sample_pages 定義。如需更多資訊,請參閱 第 17.8.10.2 節,「設定非持續性最佳化工具統計資料參數」

如需更深入估算 ANALYZE TABLE 複雜度的方法,請考慮下列範例。

Big O 表示法中,ANALYZE TABLE 複雜度描述為

 O(n_sample
  * (n_cols_in_uniq_i
     + n_cols_in_non_uniq_i
     + n_cols_in_pk * (1 + n_non_uniq_i))
  * n_part)

其中

  • n_sample 是取樣的頁面數量(由 innodb_stats_persistent_sample_pages 定義)

  • n_cols_in_uniq_i 是所有唯一索引中所有資料行的總數(不計算主鍵資料行)

  • n_cols_in_non_uniq_i 是所有非唯一索引中所有資料行的總數

  • n_cols_in_pk 是主鍵中的資料行數量(如果未定義主鍵,InnoDB 會在內部建立單一資料行主鍵)

  • n_non_uniq_i 是表格中的非唯一索引數量

  • n_part 是分割區的數量。如果沒有定義分割區,則會將表格視為單一分割區。

現在,考慮以下表格(表格 t),其中包含一個主鍵(2 個欄位)、一個唯一索引(2 個欄位)和兩個非唯一索引(每個索引 2 個欄位)。

CREATE TABLE t (
  a INT,
  b INT,
  c INT,
  d INT,
  e INT,
  f INT,
  g INT,
  h INT,
  PRIMARY KEY (a, b),
  UNIQUE KEY i1uniq (c, d),
  KEY i2nonuniq (e, f),
  KEY i3nonuniq (g, h)
);

對於上述演算法所需的欄位和索引資料,請查詢 mysql.innodb_index_stats 持續索引統計資料表,以取得表格 t 的資料。n_diff_pfx% 統計資料顯示每個索引所計算的欄位。例如,主鍵索引會計算欄位 ab。對於非唯一索引,除了使用者定義的欄位之外,還會計算主鍵欄位 (a,b)。

注意

有關 InnoDB 持續統計資料表的更多資訊,請參閱第 17.8.10.1 節:「設定持續最佳化工具統計資料參數」

mysql> SELECT index_name, stat_name, stat_description
       FROM mysql.innodb_index_stats WHERE
       database_name='test' AND
       table_name='t' AND
       stat_name like 'n_diff_pfx%';
  +------------+--------------+------------------+
  | index_name | stat_name    | stat_description |
  +------------+--------------+------------------+
  | PRIMARY    | n_diff_pfx01 | a                |
  | PRIMARY    | n_diff_pfx02 | a,b              |
  | i1uniq     | n_diff_pfx01 | c                |
  | i1uniq     | n_diff_pfx02 | c,d              |
  | i2nonuniq  | n_diff_pfx01 | e                |
  | i2nonuniq  | n_diff_pfx02 | e,f              |
  | i2nonuniq  | n_diff_pfx03 | e,f,a            |
  | i2nonuniq  | n_diff_pfx04 | e,f,a,b          |
  | i3nonuniq  | n_diff_pfx01 | g                |
  | i3nonuniq  | n_diff_pfx02 | g,h              |
  | i3nonuniq  | n_diff_pfx03 | g,h,a            |
  | i3nonuniq  | n_diff_pfx04 | g,h,a,b          |
  +------------+--------------+------------------+

根據上面顯示的索引統計資料和表格定義,可以確定以下值:

  • n_cols_in_uniq_i,所有唯一索引(不包含主鍵欄位)中的所有欄位總數為 2 (cd)。

  • n_cols_in_non_uniq_i,所有非唯一索引中的所有欄位總數為 4 (efgh)。

  • n_cols_in_pk,主鍵中的欄位數為 2 (ab)。

  • n_non_uniq_i,表格中的非唯一索引數為 2 (i2nonuniqi3nonuniq)。

  • n_part,分割區的數量為 1。

您現在可以計算 innodb_stats_persistent_sample_pages * (2 + 4 + 2 * (1 + 2)) * 1,以決定掃描的葉節點頁面數量。將 innodb_stats_persistent_sample_pages 設定為預設值 20,且預設頁面大小為 16 KiB (innodb_page_size=16384),您就可以估計為表格 t 讀取了 20 * 12 * 16384 位元組,約為 4 MiB

注意

並非所有 4 MiB 都會從磁碟讀取,因為某些葉節點頁面可能已經快取在緩衝池中。