mysql получает последние записи по порядку по desc без подзапроса

#mysql #sql

#mysql #sql

Вопрос:

Я пытаюсь получить результат с помощью приведенного ниже запроса, но для его извлечения требуется около 2 минут

 SELECT * 
FROM customer e 
WHERE e.id=324 
AND e.g_id IN('x133fv','be6544','e992170','93611c') 
and e.enrol_id = 
(
 select e1.enrol_id 
 from customer e1 
 WHERE e1.id=324 
 AND e1.g_id=e.g_id 
 ORDER BY update_time DESC, posted_time DESC, enrol_id DESC 
 LIMIT 1
)
  

У меня есть индекс (g_id, id)

Есть ли какой-либо другой способ получить результат через СОЕДИНЕНИЕ?

Комментарии:

1. Я согласен с Гордоном в этом. Не ищите другого способа. Этот запрос выглядит хорошо и хорошо читается. Если это занимает слишком много времени, вам следует взглянуть на план ОБЪЯСНЕНИЯ и попытаться выяснить, можно ли сделать его эффективным, добавив индекс. Поскольку у вас есть 2 условия равенства для id и g_id и order by для еще 3 столбцов, предложение Гордона о добавлении составного индекса из 5 столбцов может очень хорошо решить ваши проблемы.

2. Frazz, индекс Гордона просто помог мне выиграть 6 секунд от общего времени вывода 2min. 🙁

Ответ №1:

Это ваш запрос:

 SELECT *
FROM customer e
WHERE e.id = 324 AND
      e.g_id IN ('x133fv','be6544','e992170','93611c') and
      e.enrol_id = (select e1.enrol_id
                    from customer e1
                    WHERE e1.id=324 AND e1.g_id=e.g_id
                    ORDER BY update_time DESC, posted_time DESC, enrol_id DESC
                    LIMIT 1
                   )
  

Вы можете повысить производительность с помощью индексов. Я бы предложил: customer(id, g_id, update_time, posted_time, enrol_id) .

Комментарии:

1. Спасибо за ответ… Но возможно ли получить СОЕДИНЕНИЕ, а не подзапрос?

2. Я добавил этот индекс, но все еще использую старый индекс (g_id, id). Также анализировал таблицу несколько раз и тоже индексировал ПРИНУДИТЕЛЬНО, но все равно занимал столько же времени..

3. @user3752021 . , , Когда я смотрю на запрос, необходим только один индекс.

4. Новый индекс клиента (id, g_id, update_time, posted_time, enroll_id) помог выиграть всего 6 секунд от первоначального времени вывода 2min. 🙁 любой другой вариант для сокращения времени.

5. @user3752021 . . . Попробуйте сделать это: customer(g_id, id, update_time, posted_time, enrol_id)