@grisha2217

Как оптимизировать SQL запрос с order by?

Всем привет. У меня есть довольно сложный запрос для поиска элементов по базе данных с несколькими inner join. В конце запроса я пишу ORDER BY item.price DESC LIMIT 20, он выполняется за 0.3 секунды, меня устраивает такой показатель. А если поменять сортировку с DESC на ASC, то выполняется уже за 5.9 секунд.
Индекс на price стоит.
Как быть?

Сам запрос, если нужно:
запрос
SELECT item.*, 
       user.username, 
       user.avatar_date, 
       user.is_banned, 
       user.user_group_id, 
       user.secondary_group_ids, 
       user.display_style_group_id, 
       market_user.*, 
       steam_item.* 
FROM   market_item AS item 
       LEFT JOIN xf_user AS user 
              ON ( item.user_id = user.user_id ) 
       INNER JOIN market_user 
               ON ( item.user_id = market_user.user_id ) 
       LEFT JOIN market_steam_item AS steam_item 
              ON ( item.item_id = steam_item.steam_item_id ) 
WHERE  ( item.category_id = 1 ) 
       AND ( item.item_state = 'active' ) 
       AND ( (SELECT Count(*) 
              FROM   market_item_game 
              WHERE  market_item_game.item_id = item.item_id 
                     AND (( game_id = 730 
                            AND market_item_game.is_banned = 0 ))) = 1 ) 
       AND ( steam_item.steam_csgo_ban_date < 1579026194 ) 
       AND ( steam_item.account_community_ban = 0 ) 
ORDER  BY item.price DESC 
LIMIT  20
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 1
zabudkin
@zabudkin
Инженер-системотехник, программист, админ, ТПУ!!!!
SELECT item.*,
user.username,
user.avatar_date,
user.is_banned,
user.user_group_id,
user.secondary_group_ids,
user.display_style_group_id,
market_user.*,
steam_item.*
FROM (
SELECT item.*,
user.username,
user.avatar_date,
user.is_banned,
user.user_group_id,
user.secondary_group_ids,
user.display_style_group_id,
market_user.*,
steam_item.*
FROM market_item AS item
LEFT JOIN xf_user AS user
ON ( item.user_id = user.user_id )
INNER JOIN market_user
ON ( item.user_id = market_user.user_id )
LEFT JOIN market_steam_item AS steam_item
ON ( item.item_id = steam_item.steam_item_id )
WHERE ( item.category_id = 1 )
AND ( item.item_state = 'active' )
AND ( (SELECT Count(*)
FROM market_item_game
WHERE market_item_game.item_id = item.item_id
AND (( game_id = 730
AND market_item_game.is_banned = 0 ))) = 1 )
AND ( steam_item.steam_csgo_ban_date < 1579026194 )
AND ( steam_item.account_community_ban = 0 )
LIMIT 20
)
ORDER BY item.price ASC
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы