Составной индекс: пол, возраст, доход и сортировка по дате

SQLMiddle10 минпроверка — Спринтиндекс · PostgreSQL14-t006

Построй оптимальный индекс для запроса:

SELECT * FROM persons
WHERE gender = 'm' AND income > 300000 AND age = 20
ORDER BY created_at;

Какие типы индексов существуют и почему здесь нужен составной индекс именно с таким порядком колонок?

schema.sqlsql
1CREATE TABLE persons (2    id         bigint PRIMARY KEY,3    gender     text   NOT NULL,4    age        int    NOT NULL,5    income     int    NOT NULL,6    created_at timestamptz NOT NULL7);8INSERT INTO persons9SELECT i,10       CASE WHEN i % 2 = 0 THEN 'm' ELSE 'f' END,11       18 + (i * 7) % 53,12       (i * 7919) % 1000000,13       timestamptz '2020-01-01' + (i * 37 % 100000) * interval '1 minute'14FROM generate_series(1, 100000) AS i;
query.sqlsql
1SELECT * FROM persons WHERE gender = 'm' AND income > 300000 AND age = 20 ORDER BY created_at
⌘ Enter — проверить