Spec-Zone.ru › MySQL 8.4

10.9.6 Статистика оптимизатора

Таблица словаря данных column_statistics хранит статистику гистограмм значений столбцов, используемую оптимизатором для построения планов выполнения запросов. Для управления гистограммами используйте оператор ANALYZE TABLE.

Таблица column_statistics имеет следующие характеристики:

  • Таблица содержит статистику для столбцов всех типов данных, кроме геометрических типов (пространственных данных) и JSON.

  • Таблица является постоянной, поэтому статистика столбцов не должна создаваться каждый раз при запуске сервера.

  • Сервер выполняет обновления таблицы; пользователи этого не делают.

Таблица column_statistics не доступна пользователям напрямую, поскольку является частью словаря данных. Информация о гистограммах доступна с помощью INFORMATION_SCHEMA.COLUMN_STATISTICS, которая реализована как представление на таблице словаря данных. COLUMN_STATISTICS содержит следующие столбцы:

  • SCHEMA_NAME, TABLE_NAME, COLUMN_NAME: Имена схемы, таблицы и столбца, к которым относятся данные статистики.

  • HISTOGRAM: Значение JSON, описывающее статистику столбца, хранящееся как гистограмма.

Гистограммы столбцов содержат корзины для частей диапазона значений, хранящихся в столбце. Гистограммы являются объектами JSON для обеспечения гибкости в представлении статистики столбцов. Вот пример объекта гистограммы:

{
  "buckets": [
    [
      1,
      0.3333333333333333
    ],
    [
      2,
      0.6666666666666666
    ],
    [
      3,
      1
    ]
  ],
  "null-values": 0,
  "last-updated": "2017-03-24 13:32:40.000000",
  "sampling-rate": 1,
  "histogram-type": "singleton",
  "number-of-buckets-specified": 128,
  "data-type": "int",
  "collation-id": 8
}

Объекты гистограмм имеют следующие ключи:

  • buckets: Корзины гистограммы. Структура корзины зависит от типа гистограммы.

    Для singleton гистограмм корзины содержат два значения:

    • Значение 1: Значение для корзины. Тип зависит от типа данных столбца.

    • Значение 2: Двойное число, представляющее кумулятивную частоту для значения. Например, 0,25 и 0,75 указывают на то, что 25% и 75% значений в столбце меньше или равны значению корзины.

    Для equi-height гистограмм корзины содержат четыре значения:

    • Значения 1, 2: Нижнее и верхнее (включительно) значения для корзины. Тип зависит от типа данных столбца.

    • Значение 3: Двойное число, представляющее кумулятивную частоту для значения. Например, 0,25 и 0,75 указывают на то, что 25% и 75% значений в столбце меньше или равны верхнему значению корзины.

    • Значение 4: Количество уникальных значений в диапазоне от нижнего значения корзины до её верхнего значения.

  • null-values: Число от 0,0 до 1,0, указывающее на долю значений столбца, являющихся значениями SQL NULL. Если 0, столбец не содержит значений NULL.

  • last-updated: Время создания гистограммы в формате UTC в формате YYYY-MM-DD hh:mm:ss.uuuuuu.

  • sampling-rate: Число от 0,0 до 1,0, указывающее на долю данных, которая была взята для создания гистограммы. Значение 1 означает, что были прочитаны все данные (без выборки).

  • histogram-type: Тип гистограммы:

    • singleton: Одна корзина представляет одно единственное значение в столбце. Этот тип гистограммы создаётся, когда количество уникальных значений в столбце меньше или равно количеству корзин, указанному в операторе ANALYZE TABLE, который сгенерировал гистограмму.

    • equi-height: Одна корзина представляет диапазон значений. Этот тип гистограммы создаётся, когда количество уникальных значений в столбце больше количества корзин, указанного в операторе ANALYZE TABLE, который сгенерировал гистограмму.

  • number-of-buckets-specified: Количество корзин, указанное в операторе ANALYZE TABLE, который сгенерировал гистограмму.

  • data-type: Тип данных, содержащихся в этой гистограмме. Это необходимо при чтении и разборе гистограмм из постоянного хранилища в память. Значение является одним из int, uint (безусловный целочисленный тип), double, decimal, datetime или string (включает символьные и двоичные строки).

  • collation-id: Идентификатор сортировки для данных гистограммы. Он имеет смысл в основном, когда значение data-type равно string. Значения соответствуют значениям столбца ID в таблице схемы информации COLLATIONS.

Для извлечения определённых значений из объектов гистограмм можно использовать операции JSON. Например:

mysql> SELECT
         TABLE_NAME, COLUMN_NAME,
         HISTOGRAM->>'$."data-type"' AS 'data-type',
         JSON_LENGTH(HISTOGRAM->>'$."buckets"') AS 'bucket-count'
       FROM INFORMATION_SCHEMA.COLUMN_STATISTICS;
+-----------------+-------------+-----------+--------------+
| TABLE_NAME      | COLUMN_NAME | data-type | bucket-count |
+-----------------+-------------+-----------+--------------+
| country         | Population  | int       |          226 |
| city            | Population  | int       |         1024 |
| countrylanguage | Language    | string    |          457 |
+-----------------+-------------+-----------+--------------+

Оптимизатор использует статистику гистограмм, если применимо, для столбцов любого типа данных, для которых собирается статистика. Оптимизатор применяет статистику гистограмм для определения оценок строк на основе селективности (эффекта фильтрации) сравнений значений столбцов с константами.

col_name = constant
col_name <> constant
col_name != constant
col_name > constant
col_name < constant
col_name >= constant
col_name <= constant
col_name IS NULL
col_name IS NOT NULL
col_name BETWEEN constant AND constant
col_name NOT BETWEEN constant AND constant
col_name IN (constant[, constant] ...)
col_name NOT IN (constant[, constant] ...)

Например, эти операторы содержат предикаты, которые подходят для использования гистограмм:

SELECT * FROM orders WHERE amount BETWEEN 100.0 AND 300.0;
SELECT * FROM tbl WHERE col1 = 15 AND col2 > 100;

Требование сравнения с константным значением включает функции, которые являются константными, такие как ABS() и FLOOR():

SELECT * FROM tbl WHERE col1 < ABS(-34);

Статистика гистограмм полезна в первую очередь для неиндексированных столбцов. Добавление индекса к столбцу, для которого применима статистика гистограмм, также может помочь оптимизатору сделать оценки строк. Компромиссы:

  • Индекс должен обновляться при изменении данных таблицы.

  • Гистограмма создается или обновляется только по запросу, поэтому она не добавляет накладных расходов при изменении данных таблицы. С другой стороны, статистика становится всё более устаревшей при модификациях таблицы, до следующего обновления.

Оптимизатор предпочитает оценки строк оптимизатора диапазона оценкам, полученным из статистики гистограмм. Если оптимизатор определяет, что применяется оптимизатор диапазона, он не использует статистику гистограмм.

Для индексированных столбцов оценки строк могут быть получены для сравнений равенства с помощью погружений в индексы (см. Раздел 10.2.1.2, «Оптимизация диапазона»). В этом случае статистика гистограмм необязательно полезна, потому что погружения в индексы могут дать лучшие оценки.

В некоторых случаях использование статистики гистограмм может не улучшить выполнение запроса (например, если статистика устарела). Чтобы проверить, так ли это, используйте ANALYZE TABLE для перегенерации статистики гистограмм, а затем снова запустите запрос.

В качестве альтернативы, для отключения статистики гистограмм, используйте ANALYZE TABLE для удаления их. Другой способ отключения статистики гистограмм — выключить флаг condition_fanout_filter системной переменной optimizer_switch (хотя это может отключить и другие оптимизации):

SET optimizer_switch='condition_fanout_filter=off';

Если используется статистика гистограмм, результат виден с помощью EXPLAIN. Рассмотрим следующий запрос, где для столбца col1 нет доступного индекса:

SELECT * FROM t1 WHERE col1 < 24;

Если статистика гистограмм показывает, что 57% строк в таблице t1 удовлетворяют предикату col1 < 24, фильтрация может происходить даже при отсутствии индекса, и EXPLAIN показывает 57.00 в столбце filtered.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/optimizer-statistics.html

Spec-Zone.ru

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