查询需要很长时间才能执行并崩溃网站

时间:2014-06-13 14:01:09

标签: mysql magento nginx database-performance

我在magento应用程序(社区版)上拥有大约2.5个lachs(250K)产品和2600个子类别。

查询

SELECT 1 status
     , e.entity_id
     , e.type_id
     , e.attribute_set_id
     , cat_index.position AS cat_index_position
     , e.name
     , e.description
     , e.short_description
     , e.price
     , e.special_price
     , e.special_from_date
     , e.special_to_date
     , e.cost
     , e.small_image
     , e.thumbnail
     , e.color
     , e.color_value
     , e.news_from_date
     , e.news_to_date
     , e.url_key
     , e.required_options
     , e.image_label
     , e.small_image_label
     , e.thumbnail_label
     , e.msrp_enabled
     , e.msrp_display_actual_price_type
     , e.msrp
     , e.tax_class_id
     , e.price_type
     , e.weight_type
     , e.price_view
     , e.shipment_type
     , e.links_purchased_separately
     , e.links_exist
     , e.open_amount_min
     , e.open_amount_max
     , e.custom_h1
     , e.awards
     , e.region
     , e.grape_type
     , e.food_match
     , e.udropship_vendor
     , e.upc_barcode
     , e.ean_barcode
     , e.mpn
     , e.size
     , e.author
     , e.format
     , e.pagination
     , e.publish_date
     , price_index.price
     , price_index.tax_class_id
     , price_index.final_price
     , IF(price_index.tier_price IS NOT NULL
     , LEAST(price_index.min_price
     , price_index.tier_price)
     , price_index.min_price) AS minimal_price
     , price_index.min_price
     , price_index.max_price
     , price_index.tier_price 
  FROM catalog_product_flat_1 e
  JOIN catalog_category_product_index cat_index 
    ON cat_index.product_id = e.entity_id 
   AND cat_index.store_id = 1 
   AND cat_index.visibility IN(2,4) 
   AND cat_index.category_id = 163
  JOIN catalog_product_index_price price_index 
    ON price_index.entity_id = e.entity_id 
   AND price_index.website_id = 1 
   AND price_index.customer_group_id = 0 
 GROUP 
    BY e.entity_id 
 ORDER 
    BY cat_index_position ASC
     , cat_index.position ASC 
 LIMIT 15;

每当访问此magento站点上的任何产品时,它在服务器上的/ tmp目录下创建了一个巨大的数据,大约10 GB。

我该如何解决这个问题,请提出一些解决方案。

数据库大小为50 GB,服务器为nginx。

2 个答案:

答案 0 :(得分:5)

您滥用GROUP BY。请了解它是如何工作的。 MySQL中存在一种错误,允许您滥用它。不幸的是,滥用它的查询很难排除故障。

很难从查询中推断出您要执行的操作。当您处理该大小的结果集时,有助于了解您的意图。

如果您还没有,您应该知道表单

的查询
 SELECT <<many columns>>
   FROM large_table
   JOIN another_large_table ON something
   JOIN another_large_table ON something
  ORDER BY some_arbitrary_column
  LIMIT some_small_number

可能非常低效,因为它们必须生成一个巨大的结果集,然后对整个事物进行排序,然后返回第一个结果。排序操作带有整个结果集。你可以指示MySQL服务器对一两行(几十个megarows)进行排序。

看起来您希望前15个结果以最低cat_index.position值开头。因此,您可以通过加入您调用cat_index的表格的相应子集来加快查询速度,如下所示:

SELECT 1 status, many_other_columns
  FROM catalog_product_flat_1 e
  JOIN (   /* join only with fifteen lowest eligible position values in cat_index */
     SELECT * 
       FROM catalog_category_product_index
      WHERE store_id = 1 
        AND visibility IN(2,4) 
        AND category_id = 163
      ORDER BY position ASC
      LIMIT 15
       ) AS cat_index ON cat_index.product_id = e.entity_id 
  JOIN catalog_product_index_price price_index 
             ON price_index.entity_id = e.entity_id 
            AND price_index.website_id = 1 
            AND price_index.customer_group_id = 0 
 GROUP BY e.entity_id     /*wrong!!*/
 ORDER BY cat_index_position ASC,   /* redundant!*/
          cat_index.position ASC 
 LIMIT 15;

值得一试。

答案 1 :(得分:0)

您是否有足够的硬件资源来运行大型查询,还请更新服务器的硬件配置。