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;
Оптимизация запросов с помощью индексов
Индексы особенно полезны для:
Ускорения поиска по условиям WHERE
Оптимизации JOIN-операций
Ускорения сортировки (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 - указывает на используемый индекс
Практические рекомендации
Создавайте индексы для часто используемых условий WHERE
Для JOIN-операций индексируйте поля связи
Используйте составные индексы для часто совместно запрашиваемых полей
Избегайте избыточных индексов - они замедляют INSERT/UPDATE
Анализируйте запросы с EXPLAIN QUERY PLAN
Для текстового поиска используйте 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';