Проблема производительности запросов MySQL - INNER JOIN, ORDER BY, DESC - PullRequest
0 голосов
/ 25 августа 2011

Я получил этот запрос:

                SELECT 
                t.type_id, t.product_id, u.account_id, t.name, u.username

                FROM
                types AS t

                INNER JOIN
                ( SELECT user_id, username, account_id 
                  FROM users WHERE account_id=$account_id ) AS u

                ON 

                t.user_id = u.user_id 

                ORDER BY 
                t.type_id DESC

1-й вопрос:

В настоящий момент это занимает около 30 секунд, а в таблице типов только 18 тыс. Записей.

На данный момент единственными индексами являются только первичные индексы только с идентификатором.

Будет ли длительное время вызвано отсутствием большего количества индексов? Или это будет больше связано со структурой этого запроса?

2-й вопрос:

Как я могу добавить LIMIT, чтобы я получил только 100 записей с самым высоким type_id?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Без изменения результатов, я думаю, что это будет в 100 раз быстрее, если вы не сделаете дополнительный выбор из своей таблицы пользователей. Это не нужно вообще в этом случае.

Вы можете просто добавить LIMIT 100, чтобы получить только первые 100 результатов (или меньше, если нет 100).

SELECT SQL_CALC_FOUND_ROWS /* Calculate the total number of rows, without the LIMIT */
  t.type_id, t.product_id, u.account_id, t.name, u.username
FROM
  types t
  INNER JOIN users u ON u.user_id = t.user_id
WHERE
  u.account_id = $account_id
ORDER BY
  t.type_id DESC
LIMIT 1

Затем выполните второй запрос, чтобы получить общее количество вычисляемых строк.

SELECT FOUND_ROWS()
0 голосов
/ 25 августа 2011

Этот суб-выбор на MySQL замедлит ваш запрос.Я предполагаю, что это

SELECT user_id, username, account_id 
FROM users WHERE account_id=$account_id

вообще не возвращает много строк.Если это так, то один только вспомогательный выбор не будет объяснять задержку, которую вы видите.

Попробуйте добавить индекс user_id в таблицу типов.Без этого вы выполняете полное сканирование таблицы из 18 тыс. Записей для каждой записи, возвращаемой этим подпунктом выбора.

Внутреннее присоединение к таблице пользователей и добавление этого индекса, и я уверен, что вы увидите значительное увеличение скорости.

...