具有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_order
,dtb_order_detail
,dtb_products
,dtb_products_class
您可以发布说明计划为您查询 – Rahul
你应该从哪里开始呢?通过查看解释计划 –
嗨@Rahul我在问题中添加了该信息。谢谢:) – Ardian