[英]MySQL rand() function in ORDER BY
我有具有sql查詢的舊代碼,現在我需要優化該查詢,因為它在生產服務器中花費的時間太長(14秒)。 我仍然不確定從哪里開始。 特別是在rand()函數中,因為它似乎存在性能問題
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/,但我仍在弄清楚如何在上面的查詢中實現該方法。
非常感謝您的幫助。
謝謝
編輯
要求是:
獲取具有固定產品ID(例如1256)的產品ID,然后獲取每個產品信息,包括從價格表中獲取的信息。
編輯
查詢表
dtb_order
, dtb_order_detail
, dtb_products
, dtb_products_class
我沒有閱讀您的問題正文,但通常,我會限制80,將sql結果集保存到某些緩存的存儲中(您可以使用json編碼或序列化並將內容放入文件中),並在需要時從您的存儲空間,並從中獲得8個隨機物品。 另外,在將一些數據添加到表中時,請考慮緩存存儲重置功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.