Spec-Zone.ru › MySQL 5.7

14.8.11.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. Дополнительную информацию можно найти в Разделе 14.8.11.1, «Настройка параметров статистики оптимизатора для постоянного хранения».

Если innodb_stats_persistent=OFF не используется, количество страниц, используемых для выборки, определяется параметром innodb_stats_transient_sample_pages. Дополнительную информацию см. в Разделе 14.8.11.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 см. в Разделе 14.8.11.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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-analyze-table-complexity.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API