慢速 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
)
子查询是获取最低价的listing ID。子查询因 Order by 而变慢。我已经创建了索引,还需要5-6秒。
Table结构:
目录:这是主产品目录 table
Catalog
-------
id
sku
name
description
产品:存储产品变体(尺寸选项)
Products
--------
id
catalog_id
size
listing table:: 存储产品列表,一个产品尺寸选项可以有多个不同价格的产品列表。
listing
---------
id
product_id
list_price
created_at
显示每个列表和尺寸的最低价格。
由于您的子查询实际上没有做任何事情,请试试这个。如果这不起作用,post 解释语句的输出并避免使用 table 别名,如 '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 秒
谢谢!
查询如下:
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
)
子查询是获取最低价的listing ID。子查询因 Order by 而变慢。我已经创建了索引,还需要5-6秒。
Table结构:
目录:这是主产品目录 table
Catalog
-------
id
sku
name
description
产品:存储产品变体(尺寸选项)
Products
--------
id
catalog_id
size
listing table:: 存储产品列表,一个产品尺寸选项可以有多个不同价格的产品列表。
listing
---------
id
product_id
list_price
created_at
显示每个列表和尺寸的最低价格。
由于您的子查询实际上没有做任何事情,请试试这个。如果这不起作用,post 解释语句的输出并避免使用 table 别名,如 '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 秒
谢谢!