ANALYZE TABLE
的複雜度,對於 InnoDB
資料表取決於
取樣頁面的數量,如
innodb_stats_persistent_sample_pages
所定義。資料表中的索引欄位數
分割區數量。如果資料表沒有分割區,則分割區數量視為 1。
使用這些參數,預估 ANALYZE TABLE
複雜度的近似公式為
innodb_stats_persistent_sample_pages
的值 * 資料表中的索引欄位數 * 分割區數量
一般來說,產生的值越大,ANALYZE TABLE
的執行時間就越長。
innodb_stats_persistent_sample_pages
定義了在全域層級取樣的頁面數。若要為個別資料表設定取樣的頁面數,請搭配 CREATE TABLE
或 ALTER 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)
);
對於上述演算法所需的欄位和索引資料,請查詢表格 t
的 mysql.innodb_index_stats
持久索引統計資料表。n_diff_pfx%
統計資料顯示每個索引所計數的欄位。例如,欄位 a
和 b
會針對主鍵索引進行計數。對於非唯一索引,除了使用者定義的欄位之外,還會計數主鍵欄位 (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 (c
和d
)。n_cols_in_non_uniq_i
,所有非唯一索引中所有欄位的總數,為 4 (e
、f
、g
和h
)。n_cols_in_pk
,主鍵中的欄位數,為 2 (a
和b
)。n_non_uniq_i
,表格中非唯一索引的數量,為 2 (i2nonuniq
和i3nonuniq
)。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
都會從磁碟讀取,因為某些葉頁可能已經快取在緩衝池中。