Добавление дополнительных данных и анализ сортировки
Давайте добавим больше данных, чтобы анализ плана запроса (query plan analysis) был более информативным. Вставьте следующие данные в таблицу employees
(сотрудники):
INSERT INTO employees (first_name, last_name, email, department) VALUES
('Alice', 'Johnson', '[email protected]', 'HR'),
('Bob', 'Williams', '[email protected]', 'Finance'),
('Charlie', 'Brown', '[email protected]', 'IT'),
('David', 'Miller', '[email protected]', 'Sales'),
('Eve', 'Wilson', '[email protected]', 'Marketing'),
('John', 'Taylor', '[email protected]', 'Engineering'),
('Jane', 'Anderson', '[email protected]', 'HR'),
('Robert', 'Thomas', '[email protected]', 'Finance'),
('Emily', 'Jackson', '[email protected]', 'IT'),
('Michael', 'White', '[email protected]', 'Sales');
Теперь давайте проанализируем более сложный запрос, включающий сортировку. Предположим, вы хотите найти всех сотрудников в отделе 'Sales' (продажи) и отсортировать их по фамилии. Вы можете использовать следующий запрос:
SELECT * FROM employees WHERE department = 'Sales' ORDER BY last_name;
Проанализируйте план запроса:
EXPLAIN QUERY PLAN SELECT * FROM employees WHERE department = 'Sales' ORDER BY last_name;
Вывод может выглядеть так:
QUERY PLAN
`--SCAN employees USING INDEX idx_lastname
В этом случае SQLite выполняет полное сканирование таблицы (full table scan), а затем сортирует результаты.
Давайте создадим индекс для столбца department
(отдел):
CREATE INDEX idx_department ON employees (department);
Теперь проанализируйте план запроса еще раз:
EXPLAIN QUERY PLAN SELECT * FROM employees WHERE department = 'Sales' ORDER BY last_name;
Вывод может измениться на:
QUERY PLAN
|--SEARCH employees USING INDEX idx_department (department=?)
`--USE TEMP B-TREE FOR ORDER BY
Теперь SQLite использует индекс idx_department
для поиска сотрудников в отделе 'Sales', но ему все равно нужно сортировать результаты.