1. Работа с индексами в SQLite

Индексы - это специальные объекты базы данных, которые ускоряют поиск и сортировку данных.

Создание и удаление индексов

Создание индекса:

-- Простой индекс для одного столбца
CREATE INDEX idx_customer_name ON customers(customerName);

-- Уникальный индекс
CREATE UNIQUE INDEX idx_unique_email ON employees(email);

-- Составной индекс (по нескольким столбцам)
CREATE INDEX idx_city_country ON customers(city, country);

Удаление индекса:

DROP INDEX idx_customer_name;

Оптимизация запросов с помощью индексов

Индексы особенно полезны для:

  1. Ускорения поиска по условиям WHERE

  2. Оптимизации JOIN-операций

  3. Ускорения сортировки (ORDER BY)

Примеры эффективного использования:

-- Этот запрос использует индекс idx_customer_name
SELECT * FROM customers
WHERE customerName = 'Atelier graphique';

-- Использование составного индекса
SELECT * FROM customers
WHERE city = 'Paris' AND country = 'France';

Когда индексы не помогают: - При обработке небольших таблиц - Если условие использует функции (WHERE UPPER(name) = „SMITH“) - При неселективных условиях (WHERE status IN („active“, „inactive“))

EXPLAIN QUERY PLAN - анализ выполнения запросов

Команда EXPLAIN QUERY PLAN показывает как SQLite выполняет запрос:

EXPLAIN QUERY PLAN
SELECT c.customerName, o.orderDate
FROM customers c
JOIN orders o ON c.customerNumber = o.customerNumber
WHERE c.country = 'USA';

Пример вывода:

Ключевые термины: - SCAN TABLE - полный перебор таблицы (медленно) - SEARCH TABLE - поиск по индексу (быстро) - USING INDEX - указывает на используемый индекс

Практические рекомендации

  1. Создавайте индексы для часто используемых условий WHERE

  2. Для JOIN-операций индексируйте поля связи

  3. Используйте составные индексы для часто совместно запрашиваемых полей

  4. Избегайте избыточных индексов - они замедляют INSERT/UPDATE

  5. Анализируйте запросы с EXPLAIN QUERY PLAN

  6. Для текстового поиска используйте FTS (Full Text Search)

Пример создания оптимального индекса:

-- Перед созданием индекса анализируем запрос
EXPLAIN QUERY PLAN
SELECT * FROM orders
WHERE orderDate BETWEEN '2023-01-01' AND '2023-12-31'
AND status = 'Shipped';

-- Создаем индекс для ускорения
CREATE INDEX idx_order_date_status ON orders(orderDate, status);

-- Проверяем использование индекса
EXPLAIN QUERY PLAN
SELECT * FROM orders
WHERE orderDate BETWEEN '2023-01-01' AND '2023-12-31'
AND status = 'Shipped';