Как работает разреженный первичный индекс в ClickHouse?
Разреженный первичный индекс в ClickHouse помогает эффективно определять гранулы — блоки строк, — которые могут содержать данные, соответствующие условию запроса по столбцам первичного ключа таблицы. В следующем разделе мы объясним, как этот индекс строится на основе значений этих столбцов.
Создание разреженного первичного индекса
Для обработки данные каждого столбца ④ логически делятся на гранулы — каждая охватывает 8 192 строки, — которые являются наименьшими единицами, с которыми работают механизмы обработки данных ClickHouse. Именно такая структура гранул делает первичный индекс разреженным: вместо индексации каждой строки ClickHouse сохраняет ⑤ значения первичного ключа только из одной строки на гранулу — а именно из первой. В результате получается одна запись индекса на гранулу:
Благодаря своей разреженности первичный индекс достаточно мал, чтобы полностью помещаться в памяти, что обеспечивает быструю фильтрацию запросов с предикатами по столбцам первичного ключа. В следующем разделе мы покажем, как он помогает ускорять такие запросы.
Ниже схематично показано, как разреженный первичный индекс используется для ускорения запросов:
① Пример запроса содержит условие по обоим столбцам первичного ключа:
town = 'LONDON' AND street = 'OXFORD STREET'.
② Чтобы ускорить запрос, ClickHouse загружает первичный индекс таблицы в память.
③ Затем он просматривает записи индекса, чтобы определить, какие гранулы могут содержать строки, соответствующие условию, — иными словами, какие гранулы нельзя пропустить.
④ Затем эти потенциально релевантные гранулы загружаются и обрабатываются в памяти вместе с соответствующими гранулами из всех остальных столбцов, необходимых для выполнения запроса.
Мониторинг первичных индексов
Ключевые выводы
- Разреженные первичные индексы помогают ClickHouse пропускать лишние данные, определяя, какие гранулы могут содержать строки, соответствующие условиям запроса по столбцам первичного ключа.
- Каждый индекс хранит только значения первичного ключа из первой строки каждой гранулы (по умолчанию гранула содержит 8 192 строки), поэтому он достаточно компактен, чтобы умещаться в памяти.
- Каждая часть данных в таблице MergeTree имеет собственный первичный индекс, который используется независимо при выполнении запроса.
- Во время выполнения запросов индекс позволяет ClickHouse пропускать гранулы, сокращая I/O и использование памяти, что повышает производительность.
-
Вы можете просматривать содержимое индекса с помощью табличной функции
mergeTreeIndexи отслеживать использование индекса с помощью предложенияEXPLAIN.