DEV Community

Erlan Akbaraliev
Erlan Akbaraliev

Posted on

БД6 (Index, оптимизация)

Index

Index - структура которая используется чтобы ускорить процесс получения данных.

SELECT * FROM книги
WHERE название='Белая книга';
Enter fullscreen mode Exit fullscreen mode

Index1

Мы получили данные за 0.103 секунд.
Это очень быстро, но если у нас в базе данных есть миллион книг, а не 73, то в этом случае запрос займет несколько секунд.

Мы можем индексировать столбец название таблицы книги, чтобы получить данные быстрее.

CREATE INDEX книги_название_индекс
ON книги (название);
Enter fullscreen mode Exit fullscreen mode

Если индексы ускоряют можно ли индексировать все столбцы наших таблиц?
Создать индекс практически на каждый столбец возможно, но категорически не рекомендуется.
Индексирование столбцов требует много памяти, это увеличивает стоимость хранения и замедляет скорость измение данных (INSERT, UPDATE, DELETE).

Можно и создать индексы на конкретные данные:

CREATE INDEX последние_книги
ON книги(год)
WHERE год=2023;
Enter fullscreen mode Exit fullscreen mode

Если у нас часто спрашивают книги которые были опубликованы в 2023 году, можно эти данные индексировать чтобы быстро их получать.


Транзации

Создайте эту таблицу

CREATE table счета (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    balance INT check(balance > 0)
);

INSERT INTO счета (name, balance)
VALUES 
('erlan', 10),
('алия', 20),
('нурайым', 30);

Enter fullscreen mode Exit fullscreen mode

Как выполнять несколько запросов одновременно?
Если Эрлан отправляет Алии 10 сомов, мы хотим немедленно вычесть 10 сомов со счета Эрлана и добавить 10 сомов на счет Алии.

BEGIN;
    UPDATE счета
    SET balance=balance-10
    WHERE name='erlan';

    UPDATE счета
    SET balance=balance+10
    WHERE name='алия';
COMMIT;
Enter fullscreen mode Exit fullscreen mode

Теперь у Эрлана 0 сомов и у Алии 30 сомов.
Если опять выполним этот одновременный запрос, то мы получим ошибку. Как только мы начинаем транзакцию и пишем несколько SQL-запросов, если хотя бы один из них терпит неудачу, мы можем завершить транзакцию командой ROLLBACK (откат), чтобы вернуть все значения к их состоянию до начала транзакции.

Top comments (0)