Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
非常慢的MySQL代码(内联和连接)_Mysql_Join_Inline - Fatal编程技术网

非常慢的MySQL代码(内联和连接)

非常慢的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

如何重新构造下面的查询以更快地运行?运行需要几分钟,这会显著降低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_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给出的答案所示,左连接将返回与内联选择完全相同的值,如果没有等效值,它将导致该列的空值。我添加此答案作为如何将内联连接转换为纯连接的参考:)谢谢。有些索引不存在,所以这肯定会有帮助,谢谢。有些索引不存在,因此这肯定会有所帮助