17.8.10.3 Оценка сложности ANALYZE TABLE для таблиц InnoDB
Сложность выполнения ANALYZE TABLE для таблиц InnoDB зависит от:
Количество просматриваемых страниц, определяемое параметром
innodb_stats_persistent_sample_pages.Количество индексированных столбцов в таблице
Количество разделов. Если таблица не разделена, считается, что количество разделов равно 1.
Используя эти параметры, приближенная формула для оценки сложности ANALYZE TABLE будет следующей:
Значение параметра innodb_stats_persistent_sample_pages * количество индексированных столбцов в таблице * количество разделов.
Как правило, чем больше полученное значение, тем больше время выполнения ANALYZE TABLE.
Параметр innodb_stats_persistent_sample_pages определяет количество страниц, которые будут проанализированы на глобальном уровне. Чтобы установить количество страниц для анализа конкретной таблицы, используйте опцию STATS_SAMPLE_PAGES с CREATE TABLE или ALTER TABLE. Дополнительная информация доступна в Разделе 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)
);
Для получения данных о столбцах и индексах, необходимых для алгоритма, запросите данные из таблицы постоянной статистики индексов 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 bytes, или примерно 4 MiB.
Возможно, все 4 MiB не будут прочитаны с диска, так как некоторые страницы листов могут уже быть кэшированы в буферном пуле.
© 2025 Oracle
Licensed under the GPLv2 License.