Чи є спосіб я визначити найкращий спосіб дізнатися, які індекси створити для таблиці?
WHERE
пунктах.
Чи є спосіб я визначити найкращий спосіб дізнатися, які індекси створити для таблиці?
WHERE
пунктах.
Відповіді:
Короткі правила великого пальця. (Деякі з них створюються автоматично, але, можливо, пізніше їх можна буде скинути вручну, залежно від dbms. Не припускайте, що ви завжди будете працювати на PostgreSQL.)
Кожен первинний ключ означає, що багатоколонкові первинні ключі повинні мати один індекс, що охоплює всі стовпці. PostgreSQL створить цей індекс автоматично, якщо ви оголосите первинний ключ з декількома стовпцями.
Є багато випадків, коли один індекс з декількома стовпцями дає кращу ефективність, ніж декілька індексних стовпців. Контролюйте повільні запити та робіть тестування, щоб з’ясувати, що це таке.
Припустимо, що будь-яка зміна індексації поліпшить деякі дії в базі даних та погіршить інші. Мені корисно мати набір операторів SQL, які я можу профілювати до та після внесення змін до індексів. Цей набір включає заяви SELECT, INSERT, UPDATE та DELETE.
Немає заміни для вивчення документів для вашого конкретного dbms.
Окрім того, що вже надано @Catcall , і додати невеликий коректив:
Нещодавно я також висвітлював деякі основи у цій тісно пов язаній відповіді .
На сьогодні відповіді вказують, що вам потрібно створити індекси на первинних ключах, але це не так у PostgreSQL (застосовуються часткові винятки). Цитую посібник тут :
PostgreSQL автоматично створює унікальний індекс, коли для таблиці визначено унікальне обмеження або первинний ключ. Індекс охоплює ті стовпці , які складають первинний ключ або обмеження унікальності (індексу многоколоночной, якщо це доречно), і є механізмом , який підсилює обмеження.
Сміливий акцент мій.
Ви можете створити додаткові індекси для другого чи пізніших стовпців індексу багато стовпців, але перший, як правило, покритий просто колонковим індексом, за винятком випадків, коли додаткові стовпці роблять індекс набагато більшим. Ми це детально обговорили під цим пов'язаним питанням:
Чи складний індекс також хороший для запитів у першому полі?
Багатоколінні індекси , часткові індекси та індекси виразів є особливо потужним інструментом у PostgreSQL. Оскільки PostgreSQL 9.2 також існує сканування лише для індексів , еквівалент "покриває індекси" в інших RDBMS. Це не інший тип індексу, а нова здатність RDBMS з існуючими типами індексу.
Кожен індекс несе специфічні витрати , тому немає можливості обійти деякі базові знання, щоб реально оптимізувати індексацію. Просто створення більшої кількості індексів може принести більше шкоди, ніж користі. Зокрема, індекси можуть запобігти покращенню продуктивності оновлень HOT .
Як правило, операції запису ( DELETE
, UPDATE
) дорожчають (але можуть також принести користь!), А операції читання ( SELECT
), як правило, лише приносять користь. Занадто багато індексів можуть вичерпати кеш - пам'ять , так що навіть операції читання можуть страждати.
Нарешті, ця сторінка Wiki Postgres щодо технічного обслуговування індексів містить інструменти для пошуку повторюваних чи невикористаних індексів (серед іншого).
Є два варіанти.
Відповідь на те, щоб зробити це самостійно, тут досить вичерпно задокументовано. Тож давайте розглянемо щось інше.
Pghero може допомогти вам, якщо ви хочете отримати автоматичну пораду.
Однак це має деякі недоліки.
WHERE
і ORDER BY
, ні JOINS
.Перегляньте це відео для отримання додаткової інформації .