文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man 頁面 (TGZ) - 258.2Kb
Man 頁面 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  預估 InnoDB 資料表的 ANALYZE TABLE 複雜度

17.8.10.3 預估 InnoDB 資料表的 ANALYZE TABLE 複雜度

ANALYZE TABLE 的複雜度,對於 InnoDB 資料表取決於

  • 取樣頁面的數量,如 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 個欄位)和兩個非唯一索引(每個索引兩個欄位)。

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)
);

對於上述演算法所需的欄位和索引資料,請查詢表格 tmysql.innodb_index_stats 持久索引統計資料表。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 都會從磁碟讀取,因為某些葉頁可能已經快取在緩衝池中。