非常慢的MySQL代码(内联和连接)
如何重新构造下面的查询以更快地运行?运行需要几分钟,这会显著降低Web服务器的速度。该查询使用内联查询和联接从多个表中获取产品的详细信息。我觉得一定有更快的办法 写下面的查询最有效的方法是什么非常慢的MySQL代码(内联和连接),mysql,join,inline,Mysql,Join,Inline,如何重新构造下面的查询以更快地运行?运行需要几分钟,这会显著降低Web服务器的速度。该查询使用内联查询和联接从多个表中获取产品的详细信息。我觉得一定有更快的办法 写下面的查询最有效的方法是什么 SELECT p.*, pd.*, pd.NAME AS NAME, pi.*,p.image AS default_image, (SELECT first FROM product_shipping psi WHERE psi.product_id = p.product
SELECT p.*,
pd.*, pd.NAME AS NAME, pi.*,p.image AS default_image,
(SELECT first FROM product_shipping psi
WHERE psi.product_id = p.product_id) AS flat_rate,
(SELECT NAME FROM manufacturer m
WHERE m.manufacturer_id = p.manufacturer_id) AS manufacturer,
(SELECT price FROM product_special ps
WHERE ps.product_id = p.product_id AND ps.customer_group_id = 8) AS special_price
FROM product p
LEFT JOIN product_description pd
ON ( p.product_id = pd.product_id )
LEFT JOIN product_image pi
ON ( p.product_id = pi.product_id )
ORDER BY p.product_id
select中的很多项都是重复的,但由于这是您最初获取数据的方式,所以我将其保留原样。此外,使用
左联接
s可能比内联接
s慢:
SELECT
product.*,
product_description.*,
product_description.NAME AS NAME,
product_image.*,
product.image AS default_image,
product_shipping.first AS flat_rate,
manufacturer.NAME AS manufacturer,
product_special.price AS special_price
FROM
product
LEFT JOIN product_description ON product.product_id = product_description.product_id
LEFT JOIN product_image ON product_image.product_id = product_image.product_id
LEFT JOIN manufacturer ON product.manufacturer_id = manufacturer.id
LEFT JOIN product_special ON product.product_id = product_special.product_id AND product_special.customer_group_id = 8
ORDER BY product.product_id
select中的很多项都是重复的,但由于这是您最初获取数据的方式,所以我将其保留原样。此外,使用
左联接
s可能比内联接
s慢:
SELECT
product.*,
product_description.*,
product_description.NAME AS NAME,
product_image.*,
product.image AS default_image,
product_shipping.first AS flat_rate,
manufacturer.NAME AS manufacturer,
product_special.price AS special_price
FROM
product
LEFT JOIN product_description ON product.product_id = product_description.product_id
LEFT JOIN product_image ON product_image.product_id = product_image.product_id
LEFT JOIN manufacturer ON product.manufacturer_id = manufacturer.id
LEFT JOIN product_special ON product.product_id = product_special.product_id AND product_special.customer_group_id = 8
ORDER BY product.product_id
与@Harper给出的答案不同,我选择进行内部连接,因为您是在内联选择上进行的,所以我的建议是:
SELECT p.*,
pd.*, pd.NAME AS NAME, pi.*,p.image AS default_image,
psi.first AS flat_rate,
m.NAME AS manufacturer,
ps.price AS special_price
FROM product p
INNER JOIN product_shipping psi
ON (psi.product_id = p.product_id)
INNER JOIN manufacturer m
ON (m.manufacturer_id = p.manufacturer_id)
INNER JOIN product_special ps
ON (ps.product_id = p.product_id AND ps.customer_group_id = 8)
LEFT JOIN product_description pd
ON ( p.product_id = pd.product_id )
LEFT JOIN product_image pi
ON ( p.product_id = pi.product_id )
ORDER BY p.product_id
与@Harper给出的答案不同,我选择进行内部连接,因为您是在内联选择上进行的,所以我的建议是:
SELECT p.*,
pd.*, pd.NAME AS NAME, pi.*,p.image AS default_image,
psi.first AS flat_rate,
m.NAME AS manufacturer,
ps.price AS special_price
FROM product p
INNER JOIN product_shipping psi
ON (psi.product_id = p.product_id)
INNER JOIN manufacturer m
ON (m.manufacturer_id = p.manufacturer_id)
INNER JOIN product_special ps
ON (ps.product_id = p.product_id AND ps.customer_group_id = 8)
LEFT JOIN product_description pd
ON ( p.product_id = pd.product_id )
LEFT JOIN product_image pi
ON ( p.product_id = pi.product_id )
ORDER BY p.product_id
如果没有索引,则需要索引。我想到以下几点:
product\u shipping(首先是product\u id)
制造商(制造商id、名称)
产品特色(产品标识、客户群标识、价格)
产品描述(产品id)
产品图片(产品id)
产品(产品id、制造商id)
如果没有适当的索引,重新安排子查询和联接可能对性能影响不大。如果没有索引,则需要索引。我想到以下几点:
product\u shipping(首先是product\u id)
制造商(制造商id、名称)
产品特色(产品标识、客户群标识、价格)
产品描述(产品id)
产品图片(产品id)
产品(产品id、制造商id)
重新安排子查询和联接可能对性能影响不大,如果您没有合适的索引。我建议使用JOIN而不是subquery您可以显示DB结构吗?谢谢这一点-是否可以重新构造它,使其完全使用JOIN?@Edper在内联select中只返回一列的子查询已经返回该列值。因此,
首先
将变为固定利率,如此on@JorgeCampos:谢谢,我没有马上察觉到。再次感谢您的更正。我建议使用JOIN而不是subquery您可以显示DB结构吗?谢谢-是否可以重新构造它,使其完全使用JOIN?@Edper内联选择中仅返回一列的子查询已返回该列值。因此,首先
将变为固定利率,如此on@JorgeCampos:谢谢,我没有马上察觉到。再次感谢您的更正。非常感谢-这真的很有帮助。我不完全确定如何将内联mysql转换为它所帮助的内部joinsGlad。但你要注意两件事。1——考虑@ GordonLinoff给出的答案,它将提高查询性能;2-此方法可能无法从原始查询中获取所有行,因为内联select可能没有子查询的等效行,因此,它将导致该列的空值。如Harper Maddox给出的答案中所示,左连接将返回与内联选择完全相同的值,如果没有等效值,它将导致该列的空值。我添加此答案作为如何将内联连接转换为纯连接的参考:)非常感谢-这非常有用。我不完全确定如何将内联mysql转换为它所帮助的内部joinsGlad。但你要注意两件事。1——考虑@ GordonLinoff给出的答案,它将提高查询性能;2-此方法可能无法从原始查询中获取所有行,因为内联select可能没有子查询的等效行,因此,它将导致该列的空值。如Harper Maddox给出的答案所示,左连接将返回与内联选择完全相同的值,如果没有等效值,它将导致该列的空值。我添加此答案作为如何将内联连接转换为纯连接的参考:)谢谢。有些索引不存在,所以这肯定会有帮助,谢谢。有些索引不存在,因此这肯定会有所帮助