2015-04-30 36 views
1

具有SQL查询我的遗留代码,现在我需要,因为它花费的时间太长(14秒)在生产服务器上,以优化查询。我仍然不确定从哪里开始。特别是在rand()函数中,因为它似乎有性能问题MySQL的rand()函数BY

SELECT 
     order_detail.product_id, 
     dtb_products.name, 
     dtb_products.main_list_image, 
     dtb_products_price.price01_min, 
     dtb_products_price.price01_max, 
     dtb_products_price.price02_min, 
     dtb_products_price.price02_max, 
     dtb_products.limited_flag, 
     dtb_products.limited_start_date, 
     dtb_products.limited_end_date 
    FROM 
     dtb_order 
    INNER JOIN 
     (SELECT 
     dtb_order_2.customer_id 
     FROM 
     dtb_order AS dtb_order_2 
     INNER JOIN 
     dtb_order_detail 
     ON 
     dtb_order_detail.order_id = dtb_order_2.order_id 
     WHERE 
     dtb_order_detail.product_id = 1256 
     GROUP BY 
     dtb_order_2.customer_id 
    ) AS CUSTOMER 

    ON 
     dtb_order.customer_id = CUSTOMER.customer_id 
    INNER JOIN 
     (SELECT 
     dtb_order_detail.product_id, 
     dtb_order_detail.order_id 
     FROM 
     dtb_order_detail 
     INNER JOIN 
     dtb_products 
     ON 
     dtb_products.product_id = dtb_order_detail.product_id 
     WHERE 
     dtb_order_detail.product_id <> 1256 AND dtb_products.del_flg = 0 AND dtb_products.status = 1 
    ) AS order_detail 
    ON 
     order_detail.order_id = dtb_order.order_id 
    LEFT JOIN 
     (
     SELECT product_id as product_id_sub, 
       MIN(price01) AS price01_min, 
       MAX(price01) AS price01_max, 
       MIN(price02) AS price02_min, 
       MAX(price02) AS price02_max 
     FROM dtb_products_class 
     GROUP BY product_id 
    ) AS dtb_products_price 
    ON 
     order_detail.product_id = dtb_products_price.product_id_sub 
    LEFT JOIN 
     dtb_products 
    ON 
     dtb_products.product_id = order_detail.product_id 
    GROUP BY 
     order_detail.product_id 
    ORDER BY 
     rand() 
    limit 
     8; 

我应该从哪里开始优化该查询?

我已看过一些博客文章,其中之一是http://explainextended.com/2009/03/01/selecting-random-rows/但我还是搞清楚如何实现方法在上面的查询。

我真的很感谢你的帮助。

谢谢

编辑

的要求是:

获取这些产品的IDS有一个固定的产品ID,例如买了1256 ,然后从价格表中获取这些产品的每个信息。

编辑

在查询表

dtb_orderdtb_order_detaildtb_productsdtb_products_class

+1

您可以发布说明计划为您查询 – Rahul

+0

你应该从哪里开始呢?通过查看解释计划 –

+0

嗨@Rahul我在问题中添加了该信息。谢谢:) – Ardian

回答

-2

我不看你的问题的身体,但像往常一样,我不限制80,保存SQL结果集到一些缓存存储中(你可以使用json编码,或序列化,并将内容放入文件中),并在需要时从存储中获取它,并从中获得8个随机项目。另外,当你将一些数据添加到表中时,请考虑缓存存储重置功能。

+0

感谢您的回答。我会考虑的:) – Ardian

+0

真的男人,这看起来像丑陋的黑客攻击(这是一个丑陋的黑客攻击,笑),但它在许多情况下,大多数更好的决定。如果你每小时更新一次你的缓存,没有人(我的意思是,一个用户)会看到并感觉时间延迟。 – degr