Как оптимизировать запрос MySQL?

114
15 декабря 2016, 15:43

Есть таблица 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 секунд на моем компьютере.

Подскажите, что можно сделать.

Answer 1

Можно сделать:

  1. Добавить индексы для first_name, last_name

  2. Сделать составной индекс (user_id, first_name, last_name, city_name, password, post_index, birthdate, salary), будет покрывающим. Смешно для такого кол-ва полей

  3. Добавляем составной индекс uid_lname(user_id, last_name) и разбиваем запрос на 2 запроса:

    • SELECT user_id FROM users USE INDEX(uid_lname) ORDER BY last_name ASC LIMIT 0, 300 - в этом случае индекс будет покрывающим и будет использоваться для сортировки
    • SELECT user_id, first_name, last_name, city_name, password, post_index, birthdate, salary FROM users WHERE user_id IN(результат 1-го запроса)
Answer 2

Если данные в таблице меняются не сильно часто то можно заранее отсортировать данные по нужному полю

ALTER TABLE users ORDER BY last_name ASC;

В этом случае в селекте ORDER BY уже не нужен. Но для актуальности сортировки этот запрос нужно выполнять регулярно, например по крону раз в сутки.

Answer 3

Чтобы не ворочать все данные разом, выберите сначала id и lastname. Отсортируйте по lastname, а остальные данные - присоедините через JOIN по id. Должно быть сильно быстрее.

READ ALSO
Не работает Инсерт в БД?

Не работает Инсерт в БД?

вот такой простой код! и он не работает

105
Проверка на определенные куки

Проверка на определенные куки

Всем приветЕсть система опросов, там может быть несколько разных вопросов

139
Выгружать данные при заполнении формы

Выгружать данные при заполнении формы

Этот код выгружает данные из бд по очереди при обновлении страницы, если данные закончились, он начинает сначалаКак переделать, чтобы пока...

190
Очень сложная выборка

Очень сложная выборка

В общем есть две таблицы: группы (id, название) и пользователи (id, id группы в которой состоит, рейтинг)Нужно найти количество групп, среднее арифметическое...

137