Как ускорить запрос в базу?

235
15 апреля 2017, 00:03

Ребята, вот в чем суть, есть таблица пользователей на несколько миллионов user так же есть таблица orders и users_to_orders

SELECT total FROM users LEFT JOIN users_to_orders ON users.id = users_to_orders.id_user LEFT JOIN ordersON users_to_orders.id_orders = orders.id GROUP BY firstname DESC LIMIT 0,500

запрос выполняется миллионы лет тип таблиц "MyISAM", так же стоят все индексы, как максимально сократить время выборки результата и выбрать 10 пользователей с максимальным суммарным тоталом?

в таблице users и orders индекс это id в таблице users_to_orders индексы id_orders и id_user

Answer 1
  1. Нужно делать группировку по индексу. Численному. Все строки плохо индексируются B+-деревьями, по определению.

    SELECT * FROM ( SELECT U.id as user_id, count(O.id) as total FROM users AS U LEFT JOIN users_to_orders AS UO ON U.id = UO.id_user LEFT JOIN orders AS O ON UO.id_orders = O.id GROUP BY U.id DESC ) AS P1 INNER JOIN users AS P2 ON P1.user_id = P2.id ORDER BY P1.total DESC LIMIT 0, 500;

  2. Нужно кеширование делать. Вам нужны 500 результатов - обновляйте их раз в N секунд. Например, может помочь временная таблица aka materialized view (да, их можно эмулировать по триггеру).

  3. InnoDb. Тут все просто.

Answer 2

Вам надо сначала убедиться, что узкое место именно в DB. У меня тоже в одном проекте есть до 1 млн записей, но работает весьма шустро.

Есть подозрение, что дело не таблицах. Вам надо натыкать везде логи, и найти узкое место - где больше всех задержка.

Если окажется, что проблема в таблицах.

1) Одно из самое главных используем InnoDb. MyISAM намного медленнее, там даже блокировка на уровне таблиц, а не строк.

2) Все таблицы необходимо привести к 3-ей нормальной форме. Чтобы поиск был исключительно по цифрам (они быстрее обрабатываются чем строки).

3) Скорее всего миллион записей тоже можно разбить на определенные кластеры. Если да, лучше сделать больше табличек меньшего размера.

READ ALSO
помогите новичку в php [требует правки]

помогите новичку в php [требует правки]

мне нужно чтобы при нажатии на кнопку сразу переходило по нужной ссылке , а не через созданную ссылку "подобрать" ссылка должна быть такого...

212
Как загрузить фото в настройки плагина WordPress?

Как загрузить фото в настройки плагина WordPress?

У меня есть страница настроек моего плагина, где можно добавить несколько текстовых полей и фотоСейчас ситуация такова, что при выборе файла...

199
Ближайшее значение datetime к заданному

Ближайшее значение datetime к заданному

Помогите составить запросНужно вывести строку, где datetime ближайшее значение к заданному

197
Пропорциональное обрезание фотки в php

Пропорциональное обрезание фотки в php

Всем приветНужна реализация следующей функции

235