Оптимизация индексов PostgreSQL

PostgreSQLPostgreSQLBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы узнаете, как оптимизировать производительность базы данных PostgreSQL с помощью индексирования. Вы начнете с создания образца таблицы users и заполнения ее данными. Затем вы создадите одноколоночный индекс, проанализируете планы запросов с помощью EXPLAIN, построите многоколоночный индекс и, наконец, узнаете, как удалить неиспользуемый индекс для поддержания эффективности базы данных. Этот практический опыт предоставит вам практические навыки в управлении индексами PostgreSQL.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL postgresql(("PostgreSQL")) -.-> postgresql/PostgreSQLGroup(["PostgreSQL"]) postgresql/PostgreSQLGroup -.-> postgresql/table_init("Create Basic Table") postgresql/PostgreSQLGroup -.-> postgresql/row_add("Insert One Row") postgresql/PostgreSQLGroup -.-> postgresql/data_where("Filter With WHERE") postgresql/PostgreSQLGroup -.-> postgresql/idx_simple("Create Simple Index") postgresql/PostgreSQLGroup -.-> postgresql/idx_drop("Drop Existing Index") subgraph Lab Skills postgresql/table_init -.-> lab-550955{{"Оптимизация индексов PostgreSQL"}} postgresql/row_add -.-> lab-550955{{"Оптимизация индексов PostgreSQL"}} postgresql/data_where -.-> lab-550955{{"Оптимизация индексов PostgreSQL"}} postgresql/idx_simple -.-> lab-550955{{"Оптимизация индексов PostgreSQL"}} postgresql/idx_drop -.-> lab-550955{{"Оптимизация индексов PostgreSQL"}} end

Создание одноколоночного индекса

В этом шаге вы создадите образец таблицы с именем users, а затем создадите одноколоночный индекс для столбца email. Индексы имеют решающее значение для повышения производительности запросов к базе данных, особенно при работе с большими таблицами.

Сначала подключитесь к базе данных PostgreSQL от имени пользователя postgres:

sudo -u postgres psql

Теперь создайте таблицу users. Выполните следующую SQL-команду:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100),
    created_at TIMESTAMP
);

Эта команда создает таблицу с именем users со столбцами id, username, email и created_at. Столбец id является первичным ключом и автоматически увеличивается.

Далее вставьте несколько образцов данных в таблицу users. Выполните следующие SQL-команды:

INSERT INTO users (username, email, created_at) VALUES
('john_doe', '[email protected]', NOW());
INSERT INTO users (username, email, created_at) VALUES
('jane_smith', '[email protected]', NOW());
INSERT INTO users (username, email, created_at) VALUES
('peter_jones', '[email protected]', NOW());
INSERT INTO users (username, email, created_at) VALUES
('mary_brown', '[email protected]', NOW());

Теперь вы вставили четыре строки данных в таблицу users.

Чтобы ускорить запросы на основе столбца email, создайте индекс для столбца email. Выполните следующую SQL-команду:

CREATE INDEX idx_users_email ON users (email);

Эта команда создает индекс с именем idx_users_email для столбца email таблицы users.

Чтобы убедиться, что индекс был создан, вы можете использовать команду \di в psql. Выполните следующую команду:

\di

Вы должны увидеть индекс idx_users_email в выходных данных.

Наконец, выйдите из оболочки psql, набрав:

\q

Использование EXPLAIN для анализа планов запросов

В этом шаге вы узнаете, как использовать команду EXPLAIN в PostgreSQL для анализа планов запросов. Понимание планов запросов необходимо для оптимизации запросов к базе данных и обеспечения эффективной производительности.

Сначала подключитесь к базе данных PostgreSQL от имени пользователя postgres:

sudo -u postgres psql

Теперь давайте используем команду EXPLAIN для анализа простого запроса. Выполните следующую команду:

EXPLAIN SELECT * FROM users WHERE email = '[email protected]';

Эта команда отобразит план запроса для оператора SELECT. Вывод показывает, как PostgreSQL намеревается выполнить запрос, в том числе будет ли он использовать индекс.

Чтобы получить более подробную информацию, включая стоимость (cost), вы можете использовать EXPLAIN ANALYZE. Однако для этого базового примера достаточно EXPLAIN.

Теперь давайте проанализируем запрос, который может не использовать индекс. Выполните следующую команду:

EXPLAIN SELECT * FROM users WHERE username LIKE 'john%';

Вывод, скорее всего, покажет "Seq Scan" (Sequential Scan - последовательное сканирование) по таблице users, что означает, что PostgreSQL сканирует всю таблицу для поиска соответствующих строк. Это менее эффективно, чем использование индекса.

Анализируя планы запросов с помощью EXPLAIN, вы можете выявить потенциальные узкие места в производительности и определить, эффективно ли используются ваши индексы.

Наконец, выйдите из оболочки psql, набрав:

\q

Создание многоколоночного индекса

В этом шаге вы узнаете, как создать многоколоночный индекс в PostgreSQL. Многоколоночный индекс - это индекс, который включает два или более столбцов. Он может значительно повысить производительность запросов, когда запросы фильтруют или сортируют по нескольким столбцам одновременно.

Сначала подключитесь к базе данных PostgreSQL от имени пользователя postgres:

sudo -u postgres psql

Предположим, вы часто запрашиваете таблицу users на основе столбцов username и email. Чтобы оптимизировать эти запросы, вы можете создать многоколоночный индекс для этих двух столбцов. Выполните следующую SQL-команду:

CREATE INDEX idx_users_username_email ON users (username, email);

Эта команда создает индекс с именем idx_users_username_email для столбцов username и email таблицы users. Порядок столбцов в определении индекса имеет значение. Индекс наиболее эффективен, когда запрос фильтрует по столбцам в том же порядке, в котором они указаны в индексе.

Чтобы убедиться, что индекс был создан, вы можете использовать команду \di в psql. Выполните следующую команду:

\di

Вы должны увидеть индекс idx_users_username_email в выходных данных.

Теперь давайте проанализируем запрос, который может выиграть от этого многоколоночного индекса. Выполните следующую команду:

EXPLAIN SELECT * FROM users WHERE username = 'john_doe' AND email = '[email protected]';

Вывод должен показать, что PostgreSQL использует индекс idx_users_username_email для выполнения запроса.

Наконец, выйдите из оболочки psql, набрав:

\q

Удаление неиспользуемого индекса

В этом шаге вы узнаете, как удалить неиспользуемый индекс в PostgreSQL. Индексы улучшают производительность запросов, но они также занимают место в хранилище и могут замедлить операции записи (вставку, обновление и удаление). Поэтому важно выявлять и удалять индексы, которые больше не используются.

Сначала подключитесь к базе данных PostgreSQL от имени пользователя postgres:

sudo -u postgres psql

Предположим, что после анализа ваших шаблонов запросов вы определили, что индекс idx_users_email используется редко. Чтобы удалить этот индекс, выполните следующую SQL-команду:

DROP INDEX idx_users_email;

Эта команда удаляет индекс с именем idx_users_email из базы данных.

Чтобы убедиться, что индекс был удален, вы можете использовать команду \di в psql. Выполните следующую команду:

\di

Вы больше не должны видеть индекс idx_users_email в выходных данных.

Перед удалением индекса крайне важно убедиться, что он действительно не используется. Вы можете использовать сборщик статистики PostgreSQL (PostgreSQL's statistics collector) для сбора информации об использовании индекса. Однако включение и анализ этой статистики выходит за рамки этой лабораторной работы. В реальном сценарии вы будете отслеживать использование индекса в течение определенного периода времени, прежде чем принять решение об удалении индекса.

Удаление неправильного индекса может негативно повлиять на производительность запросов. Поэтому проявляйте осторожность и тщательно анализируйте свои шаблоны запросов, прежде чем удалять какой-либо индекс.

Наконец, выйдите из оболочки psql, набрав:

\q

Итог

В этой лабораторной работе вы узнали, как создавать одноколоночные и многоколоночные индексы в PostgreSQL для повышения производительности запросов. Вы также узнали, как анализировать планы запросов с помощью EXPLAIN, чтобы определить, эффективно ли используются ваши индексы. Наконец, вы узнали, как удалить неиспользуемый индекс для поддержания эффективности базы данных. Эти навыки необходимы для оптимизации производительности базы данных PostgreSQL.