Quick start with the min_max index
Creating a table with the min_max index
Below is a minimal example: a columnar table with a primary key and a local index of type min_max on columns that are often used in filters.
CREATE TABLE events (
id Uint64 NOT NULL,
created_at Timestamp,
level Int32,
resource_id Utf8,
PRIMARY KEY (id),
INDEX idx_created_at LOCAL USING min_max
ON (created_at),
INDEX idx_level LOCAL USING min_max
ON (level)
)
WITH (
STORE = COLUMN
);
Queries and effect
After data is loaded, selective queries with filters on indexed columns can read less data: during a storage scan, the min_max index skips fragments whose value range cannot contain matching rows.
Example data and queries for the table above:
INSERT INTO events (id, created_at, level, resource_id) VALUES
(1, Timestamp("2024-01-01T00:00:00.000000Z"), 1, "res-1"),
(2, Timestamp("2024-01-01T00:01:00.000000Z"), 3, "res-42"),
(3, Timestamp("2024-01-02T00:00:00.000000Z"), 5, "res-2");
Range filter on the timestamp column:
SELECT id, resource_id
FROM events
WHERE created_at >= Timestamp("2024-01-01T00:00:00.000000Z")
AND created_at < Timestamp("2024-01-02T00:00:00.000000Z");
Range filter on the numeric column:
SELECT id, resource_id
FROM events
WHERE level BETWEEN 2 AND 4;
How to check index efficiency
To verify that the min_max index really helps, run the same selective query on a table with a sufficient amount of data before and after creating the index and compare the execution time.
Additionally:
- Details and limitations: min_max index
- Full syntax: ALTER TABLE ADD INDEX
Was the article helpful?
Previous
Next