Медленный SQL-запрос с подзапросом с Order By - PullRequest
0 голосов
/ 04 сентября 2018

Вот запрос:

SELECT product.catalog_product_id AS catalog_id, listing.id AS listing_id, 
    product.size AS size, 0 AS amount, 
    listing.list_price AS price, 
    listing.created_at AS created_date 
FROM product
INNER JOIN listing ON listing.product_id = product.id 
WHERE product.catalog_product_id = XXXX
    AND listing.id = (
        SELECT l.id
        FROM listing l
        INNER JOIN product i ON l.product_id = i.id
        WHERE i.size = product.size AND i.catalog_product_id = XXXX
        ORDER BY l.list_price ASC, l.created_at ASC
        LIMIT 1
    ) 

Sub Query - это идентификатор для получения списка по самой низкой цене. Sub Query замедляется с Order by. Я уже создал индексы, и это все еще занимает 5-6 секунд.

Структура таблицы:

каталог: это таблица каталога основных продуктов

Catalog
-------
id
sku
name
description

products: Варианты продуктов (варианты размера)

Products
--------
id
catalog_id
size 

таблица списков :: список товаров магазина, опция «Один размер товара» может иметь несколько списков товаров с разными ценами.

listing
---------
id
product_id
list_price
created_at

Выход: http://prntscr.com/kqh7fg

Показывает самую низкую цену для каждого списка и размера.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Мне удалось разобраться в этом.

SELECT product.catalog_product_id AS catalog_id, listing.id AS listing_id, 
product.size AS size,
listing.list_price AS price, 
listing.created_at AS created_date
FROM product
INNER JOIN listing ON listing.product_id = product.id
AND product.catalog_product_id = XXXX 
AND listing.id IN 
(
SELECT MIN(l.id)
FROM listing l
INNER JOIN product i ON l.product_id = i.id
WHERE i.catalog_product_id = XXXX 
AND list_price = (
SELECT MIN(list_price)
FROM listing l
INNER JOIN product it ON l.product_id = it.id
WHERE it.catalog_product_id = XXXX AND it.size = i.size
)
GROUP BY i.size
)

Вместо использования:

ORDER BY l.list_price ASC, l.created_at ASC  LIMIT 1

Я использовал Мин (цена) и Группировка по размеру, чтобы получить минимальную цену.

Производительность запросов улучшена с 5 до .5 секунд

Спасибо!

0 голосов
/ 04 сентября 2018

Поскольку ваш подзапрос на самом деле ничего не делает, попробуйте это. Если это не сработает, опубликуйте выходные данные оператора объяснения и избегайте использования псевдонимов таблиц, таких как «l» и «i». Это действительно трудно читать, и вероятность ошибок значительно возрастает (например, вы по какой-то причине присоединились к «product.size»).

SELECT
            product.catalog_product_id AS catalog_id,
            listing.id AS listing_id, 
            product.size AS size, 0 AS amount, 
            listing.list_price AS price, 
            listing.created_at AS created_date 
FROM        product
INNER JOIN  listing
    ON      listing.product_id = product.id 
WHERE       product.catalog_product_id = ?
ORDER BY    listing.list_price ASC,
            listing.created_at ASC
LIMIT       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...