針對 InnoDB
表格的 ANALYZE TABLE
複雜度取決於
取樣的頁面數量,由
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 個欄位)和兩個非唯一索引(每個索引 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%
統計資料顯示每個索引所計算的欄位。例如,主鍵索引會計算欄位 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
都會從磁碟讀取,因為某些葉節點頁面可能已經快取在緩衝池中。