簡體   English   中英

帶子查詢的慢速SQL查詢和子查詢

[英]Slow SQL Query with Sub Query with Order By

這是查詢:

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
    ) 

子查詢是獲取最低價格的列表ID。 子查詢因Order by而變慢。 我已經創建了索引,仍然需要5到6秒鍾。

表結構:

目錄:這是主產品目錄表

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

產品:存儲產品變型(尺寸選項)

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

列表:存儲商品列表,一個商品尺寸選項可以有多個價格不同的商品列表。

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

輸出: http : //prntscr.com/kqh7fg

它顯示每個列表和大小的最低價格。

由於您的子查詢實際上沒有執行任何操作,請嘗試執行此操作。 如果這不起作用,請發布explain語句的輸出,並避免使用表別名(如“ 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

我能夠解決這個問題。

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

我已經使用Min(Price)和Group By Size來獲取最小價格清單。

查詢性能從5秒提高到0.5秒

謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM