При импорте базы возникали ошибки превышения максимального размера загружаемого файла и превышения времени выполнения скрипта.
Проблема решается редактированием параметра max_execution_time в файле конфигурации php.
Проблема комплексная.
- на уровне PHP необходимо отредактировать параметры post_max_size и upload_max_filesize.
- на уровне сервера необходимо добавить или отредактировать параметр client_max_body_size в конфиге Nginx. В данном частном случае проблему можно решить, запаковав файл перед загрузкой. В этом случае его размер уменьшается до 30 Мбайт и он проходит в стандартные лимиты. Ещё один способ решения проблемы - вручную порезать файл на части. В этом случае во второй и последующих частях нужно удалить блок команд для пересоздания таблицы и оставить в каждой части нужные строки в блоке вставки. Редактор VS Code с файлами такого объёма работает достаточно быстро.
В базе перепутаны столбцы series и number. Запросы составлены с учётом фактического расположения данных в столбцах.
SELECT * FROM workers
WHERE number
= 1015 AND series
= 422269;
0,8533 сек.
Создан индекс по полю number (9056 уникальных элементов): CREATE INDEX number_index ON workers(number); (Запрос занял 2,8059 сек.) Запрос на поиск занял 0,0022 с
Создан индекс по полю series (597281 уникальных элементов): CREATE INDEX series_index ON workers(series); (Запрос занял 2,7657 сек.) Запрос занял 0,0007 сек.
При наличии обоих индексов запрос на поиск занял 0,0017 с.
SELECT * FROM workers
WHERE first_name = 'Алексей' AND birthday
> '1999-07-07';
0,9319 сек.
Создан индекс по полю first_name (380 уникальных элементов): CREATE INDEX first_name_index ON workers(first_name); (Запрос занял 4,4663 сек.) Запрос на поиск занял 0,0196 сек.
Создан индекс по полю birthday (8708 уникальных элементов): CREATE INDEX birthday_index ON workers(birthday); (Запрос занял 2,9529 сек.) Запрос на поиск занял 0,0231 сек.
При наличии обоих индексов запрос на поиск занял 0,0224 сек. Если таблица проиндексирована по столбцам number и series, запрос на поиск занимает 1,0299 сек.
SELECT COUNT(*) FROM workers
WHERE company
= 'Северсталь';
CREATE INDEX company_index ON workers(company); (Запрос занял 6,2791 сек.)
PHPMyAdmin не отображает время выполнения запроса COUNT, поэтому объективно сравнить время поиска по исходной и индексированной базам не получилось. Субъективно поиск по индексированной базе быстрее в несколько раз.
Выбрать всех инженеров с датой рождения между 1 декабря 1979 и 1 февраля 1980, отсортированных по имени и фамилии
SELECT * FROM workers
WHERE role
='Инженер' AND birthday
>='1979-12-01' AND birthday
<='1980-02-01' ORDER BY first_name ASC, last_name ASC
0,9101 сек.
0,0687 сек.
0,0508 сек.
Выбрать всех сотрудников с должностями Химик-технолог, Химик и Биохимик, которые работают в X5 Retail Group отсортированных по дате рождения - от молодых к старым
SELECT * FROM workers
WHERE (role
='Химик-технолог' OR role
='Химик' OR role
= 'Биохимик') AND company
='X5 Retail Group' ORDER BY birthday DESC
1,1788 сек.
0,1677 сек.
0,0403 сек.
0,0474 сек.
SELECT * FROM workers
WHERE company
='X5 Retail Group' AND (role
='Химик-технолог' OR role
='Химик' OR role
= 'Биохимик') ORDER BY birthday DESC
0,8874 сек. При указании первого условия по полю company выборка происходит быстрее. Дальнейшие эксперименты проводились со вторым запросом.
0,1997 сек.
0,0578 сек.
0,0348 сек.