Есть таблица users. В ней 500 000 пользователей. Нужно оптимизировать запрос выборки пользователей с учетом сортировки по first_name, last_name и т.д.
Мой запрос выглядит так:
SELECT
`user_id`,
`first_name`,
`last_name`,
`city_name`,
`password`,
`post_index`,
`birthdate`,
`salary`
FROM
`users`
ORDER BY
last_name ASC
LIMIT 0, 300
Но проблема в том, что выполняется он 1 минуту и 8 секунд на моем компьютере.
Подскажите, что можно сделать.
Можно сделать:
Добавить индексы для first_name, last_name
Сделать составной индекс (user_id, first_name, last_name, city_name, password, post_index, birthdate, salary), будет покрывающим. Смешно для такого кол-ва полей
Добавляем составной индекс uid_lname(user_id, last_name) и разбиваем запрос на 2 запроса:
SELECT user_id FROM users USE INDEX(uid_lname) ORDER BY last_name ASC LIMIT 0, 300 - в этом случае индекс будет покрывающим и будет использоваться для сортировкиELECT user_id, first_name, last_name, city_name, password, post_index, birthdate, salary FROM users WHERE user_id IN(результат 1-го запроса)Если данные в таблице меняются не сильно часто то можно заранее отсортировать данные по нужному полю
ALTER TABLE users ORDER BY last_name ASC;
В этом случае в селекте ORDER BY уже не нужен. Но для актуальности сортировки этот запрос нужно выполнять регулярно, например по крону раз в сутки.
Чтобы не ворочать все данные разом, выберите сначала id и lastname. Отсортируйте по lastname, а остальные данные - присоедините через JOIN по id. Должно быть сильно быстрее.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости