powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подскажите как ускорить запрос с сортировкой по последнему значению из другой таблицы
7 сообщений из 7, страница 1 из 1
Подскажите как ускорить запрос с сортировкой по последнему значению из другой таблицы
    #39487944
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, возможно ли ускорить выполнение запроса типа:

Код: sql
1.
2.
3.
4.
SELECT t1.*,
(SELECT value FROM t2 WHERE t2.t1_id=t1.id ORDER BY created_at LIMIT 1) as value 
FROM t1
ORDER BY value 



FOREIGN KEY стоит, но время выполнения долгое, даже не на очень большом объеме. Заполнил тыс. 50 и секунд 10 выполняется.
...
Рейтинг: 0 / 0
Подскажите как ускорить запрос с сортировкой по последнему значению из другой таблицы
    #39487945
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9,

ФАК -- 7543220
...
Рейтинг: 0 / 0
Подскажите как ускорить запрос с сортировкой по последнему значению из другой таблицы
    #39488777
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc, так это же не то. Мне нужно получить последнюю зарплату каждого работника и по ней отсортировать. А там сортировки нет. И проблема возникает из-за скорости сортировки по последней зарплате.
...
Рейтинг: 0 / 0
Подскажите как ускорить запрос с сортировкой по последнему значению из другой таблицы
    #39488782
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9javajdbc, так это же не то. Мне нужно получить последнюю зарплату каждого работника и по ней отсортировать. А там сортировки нет. И проблема возникает из-за скорости сортировки по последней зарплате.


Итак: две задачи --
(1) найти последнюю зарплату и
(2) отсортировать

Задача (1) -- см ФАК, вторая -- надо смотреть в каждом конкретном случае.

Если после ФАКа у вас останутся проблемы со скоростью, то выдайте:
1. DDL обоих таблиц (и чтоб индексы были видны)
2. точный SQL который вы использовали (один или парочку из ФАКа)
3. замерьте и озвучте 3 раза скорость выполнения с NO_CACHE хинтом
4. выдайте EXPLAIN
5. уточните какой вариант задачи (ФАК Т-1,2,3 или 4)
6. Уточните задачу -- надо выдать ВСЕ 50К записей? на екран?
или 20 самых верхних? или что?



...сам запрос (после оптимизации, без вывода на екран) на среднем железе должен
, по идее, выполнятся за 1-20 милисекунд...10 секунд -- это скучно,
Похоже у вас даже индекса на (t1_id,created_at) нет....
...
Рейтинг: 0 / 0
Подскажите как ускорить запрос с сортировкой по последнему значению из другой таблицы
    #39488811
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9Мне нужно получить последнюю зарплату каждого работника и по ней отсортировать. А там сортировки нет.А Вы не знаете, как в запрос добавить сортировку? ну так подскажу - это предложение ORDER BY. А в качестве критерия сортировки надо указать не поле или выражение, а просто номер по порядку поля в выходном наборе (какой-нибудь ORDER BY 3).
...
Рейтинг: 0 / 0
Подскажите как ускорить запрос с сортировкой по последнему значению из другой таблицы
    #39489555
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc, спасибо большое за пояснения. Уменьшил выборку до 20к и поставил индекс по t1_id и created_at.

автор1. DDL обоих таблиц (и чтоб индексы были видны)
Там только связь один ко многим и индекс который вы написали t1_id и created_at.

автор2. точный SQL который вы использовали (один или парочку из ФАКа)
3. замерьте и озвучте 3 раза скорость выполнения с NO_CACHE хинтом
4. выдайте EXPLAIN

Запрос 1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select SQL_NO_CACHE u.id, u.name, p0.value
      from users u join posts p0
        on p0.id = ( select p1.id 
                       from posts p1 
                      where p1.user_id=u.id 
                      order by created_at ASC  
                      limit 1)
     ORDER BY p0.value limit 15



idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1PRIMARYuNULLindexNULLusers_..._id_name_unique1026NULL17340100.00"Using index; Using temporary; Using filesort"1PRIMARYp0NULLeq_refPRIMARYPRIMARY4func1100.00"Using where"2"DEPENDENT SUBQUERY"p1NULLrefposts_user_id_created_at_indexposts_user_id_created_at_index4db.u.id2100.00"Using where; Using index; Using filesort"
Время выполнения: 1.25 сек


Запрос 2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select SQL_NO_CACHE u.id, u.name,
            ( select p1.value
                  from posts p1 
                  where p1.user_id=u.id 
                  order by created_at DESC  
                  limit 1) as value
      from users u
      ORDER BY value limit 15 



idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1PRIMARYuNULLindexNULLusers_..._id_name_unique1026NULL17340100.00"Using index; Using temporary; Using filesort"2"DEPENDENT SUBQUERY"p1NULLrefposts_user_id_created_at_indexposts_user_id_created_at_index4db.u.id2100.00"Using index condition; Using filesort"

Время выполнения: 0.83 сек

Запрос 3
Код: sql
1.
2.
3.
4.
5.
6.
7.
select SQL_NO_CACHE u.id, u.name, p.value  from (
            SELECT p1.user_id, max(p1.id) max_id
                  from posts p1
                  group by p1.user_id ) zz
      join posts p on zz.max_id=p.id
      join users u on u.id=p.user_id
      ORDER BY p.value DESC limit 15



idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1PRIMARY<derived2>NULLALLNULLNULLNULLNULL51294100.00"Using where; Using temporary; Using filesort"1PRIMARYpNULLeq_ref"PRIMARY и posts_user_id_created_at_index"PRIMARY4zz.max_id1100.00NULL1PRIMARYuNULLeq_refPRIMARYPRIMARY4db.p.user_id1100.00NULL2DERIVEDp1NULLindexposts_user_id_created_at_indexposts_user_id_created_at_index9NULL51294100.00"Using index"

Время выполнения: 0.28 сек


автор5. уточните какой вариант задачи (ФАК Т-1,2,3 или 4)
Больше всего похоже на Т-1,2. У меня статистика, нужно вывести последнюю проверку, типа как последнюю зарплату работника. И там 2 таких параметра. Я по этому в SELECT и указывал.

автор6. Уточните задачу -- надо выдать ВСЕ 50К записей? на екран?
или 20 самых верхних? или что?
20 самых верхних.
...
Рейтинг: 0 / 0
Подскажите как ускорить запрос с сортировкой по последнему значению из другой таблицы
    #39493265
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9javajdbc, спасибо большое за пояснения. Уменьшил выборку до 20к и поставил индекс по t1_id и created_at.

автор1. DDL обоих таблиц (и чтоб индексы были видны)
Там только связь один ко многим и индекс который вы написали t1_id и created_at.

автор2. точный SQL который вы использовали (один или парочку из ФАКа)
3. замерьте и озвучте 3 раза скорость выполнения с NO_CACHE хинтом
4. выдайте EXPLAIN

Запрос 1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select SQL_NO_CACHE u.id, u.name, p0.value
      from users u join posts p0
        on p0.id = ( select p1.id 
                       from posts p1 
                      where p1.user_id=u.id 
                      order by created_at ASC  
                      limit 1)
     ORDER BY p0.value limit 15




idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1PRIMARYuNULLindexNULLusers_..._id_name_unique1026NULL17340100.00"Using index; Using temporary; Using filesort"1PRIMARYp0NULLeq_refPRIMARYPRIMARY4func1100.00"Using where"2"DEPENDENT SUBQUERY"p1NULLrefposts_user_id_created_at_indexposts_user_id_created_at_index4db.u.id2100.00"Using where; Using index; Using filesort"
Время выполнения: 1.25 сек


Запрос 2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select SQL_NO_CACHE u.id, u.name,
            ( select p1.value
                  from posts p1 
                  where p1.user_id=u.id 
                  order by created_at DESC  
                  limit 1) as value
      from users u
      ORDER BY value limit 15 




idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1PRIMARYuNULLindexNULLusers_..._id_name_unique1026NULL17340100.00"Using index; Using temporary; Using filesort"2"DEPENDENT SUBQUERY"p1NULLrefposts_user_id_created_at_indexposts_user_id_created_at_index4db.u.id2100.00"Using index condition; Using filesort"

Время выполнения: 0.83 сек

Запрос 3
Код: sql
1.
2.
3.
4.
5.
6.
7.
select SQL_NO_CACHE u.id, u.name, p.value  from (
            SELECT p1.user_id, max(p1.id) max_id
                  from posts p1
                  group by p1.user_id ) zz
      join posts p on zz.max_id=p.id
      join users u on u.id=p.user_id
      ORDER BY p.value DESC limit 15




idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1PRIMARY<derived2>NULLALLNULLNULLNULLNULL51294100.00"Using where; Using temporary; Using filesort"1PRIMARYpNULLeq_ref"PRIMARY и posts_user_id_created_at_index"PRIMARY4zz.max_id1100.00NULL1PRIMARYuNULLeq_refPRIMARYPRIMARY4db.p.user_id1100.00NULL2DERIVEDp1NULLindexposts_user_id_created_at_indexposts_user_id_created_at_index9NULL51294100.00"Using index"

Время выполнения: 0.28 сек


автор5. уточните какой вариант задачи (ФАК Т-1,2,3 или 4)
Больше всего похоже на Т-1,2. У меня статистика, нужно вывести последнюю проверку, типа как последнюю зарплату работника. И там 2 таких параметра. Я по этому в SELECT и указывал.

автор6. Уточните задачу -- надо выдать ВСЕ 50К записей? на екран?
или 20 самых верхних? или что?
20 самых верхних.


...ок...

1. прошу пардона за поздний ответ, был в отпуске на острове свободы (без интернета)...

2. уточните сортировку -- по ИД или по CREATE_AT... можно подозреть что они
по факту одинаково сортируют, однако ИД может быть IDЕNTITY (хорошая сортировка) а
время может быть одинаковым (плохо для сортировки.)
Прeдположим сортировку по ID.

3. Uzеров можно подключить ПОСЛЕ выбора последних зарплат и отсечки ТОП 20.
нужно иметь индеx posts(user_id,id) .
Примерно так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT z2.user_id, u.name, z2.value
FROM  
(
SELECT p.user_id, p.value
(
 SELECT max(p1.id) max_id   --, p1.user_id, 
 FROM  posts p1
GROUP BY  p1.user_id 
) zz

JOIN posts p on zz.max_id=p.id
ORDER BY p.value DESC
LIMIT 15
) z2

JOIN users u ON z2.user_id = u.id
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подскажите как ускорить запрос с сортировкой по последнему значению из другой таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]