У меня довольно большая таблица, в которой наиболее распространенный запрос API выглядит примерно так:
/api/orders?status=confirmed
Фактический SQL, сгенерированный для обслуживания этого запроса, выглядит примерно так:
SELECT * FROM orders
WHERE account_id = 'X' AND status = 'confirmed' AND versionID IS NULL
ORDER BY int_id;
Что касается меня, я не могу понять, какой индекс сделает это действительно хорошо, работает на postgres 9.5.4.
Я создал индекс на (account_id, status, versionID)
, который делает все быстро по тому же запросу за исключением ORDER BY
(он использует «сканирование только по индексу»), но как только этот ORDER BY
включается, он возвращается Вернемся к комбинации «сканирования кучи растровых изображений» и «сканирования растровых индексов», которая в 50-100 раз медленнее.
Я также пытался создать индекс для (int_id ASC, account_id, status, versionID)
, и планировщик запросов, похоже, полностью его игнорировал.
Есть идеи о том, как создать индекс, который будет обслуживать полный запрос, используя "сканирование только индекса" или что-то эквивалентно быстрое?