MySQL: мне нужны индексы в этой ситуации? - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть таблица «Клиенты» и вложенная таблица «Заказы».

Для определенного просмотра мне нужно отобразить заказ last для каждого клиента.

Поскольку вы не можете использовать LIMIT в объединении, я сначала использовал комплексное решение с LEFT JOIN, GROUP_CONCAT и SUBSTRING_INDEX, чтобы получить последний заказ, но это довольно медленно, поскольку существует миллионы записей.

Затем я подумал о том, чтобы просто сохранить последний OrderID в таблице Clients, которая обновляется триггером при каждом изменении таблицы Orders. Затем я просто присоединяюсь к заказам в этом поле LastOrderID.

Может ли индекс в поле LastOrderID быть полезным в этой ситуации? Или же он не будет использоваться, поскольку исходной таблицей всегда являются клиенты, поэтому в этом поле не выполняется сортировка, поиск и т. Д.?

Причина, по которой я спрашиваю, состоит в том, что на самом деле все немного сложнее, мне может понадобиться около 20 таких полей.

Обновление:

Мой запрос сейчас:

SELECT * 
FROM Clients AS c 
LEFT JOIN Orders AS o ON o.OrderID=c.LastOrderID 

Повысит ли индекс LastOrderID в клиентах скорость или это не обязательно?

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Прежде всего, есть ли у вас индекс по внешнему ключу Клиента в таблице заказов?

Одно это должно значительно повысить производительность.

0 голосов
/ 07 декабря 2011

Возможно, ваш SQL неверен?

Это стандартный SQL: для этого вам понадобится один индекс из двух столбцов (ClientID, OrderID) в таблице Orders, что ускорит агрегирование и самостоятельное объединение

SELECT
    ...
FROM
    (
    SELECT MAX(OrderID) AS LastOrderID, ClientID
    FROM Orders
    GROUP BY ClientID
    ) o2
    JOIN
    Orders o ON o2.LastOrderID = o.ClientID AND o2.OrderID = o.ClientID
    JOIN
    Clients c PN o.ClientID = c.ClientID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...