簡體   English   中英

ORDER BY中的MySQL rand()函數

[英]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_orderdtb_order_detaildtb_productsdtb_products_class

我沒有閱讀您的問題正文,但通常,我會限制80,將sql結果集保存到某些緩存的存儲中(您可以使用json編碼或序列化並將內容放入文件中),並在需要時從您的存儲空間,並從中獲得8個隨機物品。 另外,在將一些數據添加到表中時,請考慮緩存存儲重置功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM