Получение последнего элемента в группе

Я нашел здесь несколько ответов, за которыми я следил, обнаружил, что он работает локально, поэтому я поднялся до нашего тестового окна, где я обнаружил, что этот конкретный запрос к БД длится более 1300 секунд, войдя в mysql и SHOW PROCESSLIST;, и он висит. copying to tmp table

Это Laravel 4.2, довольно старый устаревший код, который я просто пытаюсь стабилизировать, работая над более поздней версией. Этот код ниже повторяется примерно каждые 30 секунд в соответствии с api_call, что все хорошо, за исключением того, что он не завершает и не получает 504 Gateway Time-out. Я чувствую, что делаю что-то рекурсивное, или очистка действительно большой базы данных будет проблемой здесь?

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

Любая предоставленная помощь будет принята с благодарностью.

public function api_prevnames()
{
    if (Auth::user()->repeat_vistor == 'Y') {
        $names = DB::table('visitors')
            ->select(DB::raw('first_name,last_name,email,car_reg,OPTIN,vistor_company'))
            ->where('user_id', Auth::user()->id)
            ->where('hidden', 0)
            ->where('email', '<>', '')
            ->whereRaw('id IN (select MAX(id) FROM visitors GROUP BY first_name, last_name, email)')
            ->get();
    }

    return JSONResponseGenerator::successResponse($names->toArray());

}

Что генерирует этот запрос

select first_name,last_name,email,car_reg,OPTIN,vistor_company from `visitors` where `user_id` = '439' and `hidden` = '0' and `email` <> '' and id IN (select MAX(id) FROM visitors GROUP BY first_name, last_name, email)

Предыдущий код выполняется чуть менее чем за пару секунд, которые я добавил ниже:

            $names = DB::table('visitors')
            ->select(DB::raw('first_name,last_name,email,car_reg,OPTIN,vistor_company'))
            ->where('user_id', Auth::user()->id)
            ->where('hidden', 0)
            ->where('email', '<>', '')
            ->groupBy('first_name', 'last_name', 'email')
            ->get();
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать запустить следующее:

SELECT
    first_name,
    last_name,
    email,
    car_reg,
    OPTIN,
    vistor_company
FROM (
    SELECT
        MAX(id) AS id
    FROM `visitors`
    WHERE
        `user_id` = 439
        AND `hidden` = 0
        AND `email` <> ''
    GROUP BY
        first_name,
        last_name,
        email
) AS subQ
NATURAL JOIN `visitors`;

Соединения обычно быстрее, чем наоборот, но я не думаю, что это поможет, потому что вы, очевидно, не группируете по индексам. Для этого вам придется изменить структуру, и я настоятельно рекомендую это сделать. Постарайтесь уменьшить максимальную длину first_name, last_name и email, чтобы вы могли создать объединенный индекс из этих трех. Если вы можете изменить саму структуру базы данных, не убивая половину вашей системы, вам следует подумать о нормализации этой таблицы, например, иметь таблицу с посетителями, а другую - с посещениями этих посетителей (связь с внешними ключами), чтобы вместо этого вы могли группировать по ключу группировки по трем неиндексированным строкам большой длины.

Вот изображение таблицы / запроса Я также добавил текстовый запрос выше.
user5283119 17.05.2018 18:02

Абсолютно разбитый приятель, делает именно то, что мне нужно, и довольно быстро!

user5283119 18.05.2018 10:55

Я обновил вашу правку, чтобы добавить точный процесс, который я сделал, чтобы исправить это в Laravel. Очень признателен за вашу помощь.

user5283119 18.05.2018 10:57

Другие вопросы по теме