У тодішньому проєкті ми зіткнулися з повільним підрахунком рядків у великих таблицях PostgreSQL та затримками під час пагінації. На наших даних аналогічні запити в MySQL виконувалися швидше, але це спостереження не є універсальним порівнянням двох СУБД.
Підрахунок рядків
За документацією PostgreSQL, точний COUNT(*) для всієї таблиці потребує роботи, пропорційної її розміру: сервер має переглянути таблицю або індекс, що охоплює всі рядки. У нашому проєкті частково допомогли лічильники, які оновлювали тригери. Такий підхід додає власну логіку підтримання узгодженості й не є безкоштовним прискоренням будь-якого запиту.
Великий OFFSET
Рядки, пропущені через OFFSET, усе одно обчислюються сервером, тому великий зсув може бути неефективним. Ми розглядали вибірку за індексованим числовим полем, однак порядок у потрібному результаті може відрізнятися від порядку цього поля.
Для передбачуваних сторінок потрібен ORDER BY, який однозначно задає порядок. Перехід до вибірки від останнього ключа потребує відповідності умов фільтрації, сортування та індексу; сама наявність числового поля цього не забезпечує.
Історичний матеріал з оригіналу: обговорення OFFSET і LIMIT. Першоджерела: агрегатні функції та LIMIT і OFFSET у документації PostgreSQL.
Немає коментарів:
Дописати коментар