簡體   English   中英

SQL查詢花費的時間太長

[英]SQL Query taking far too long

我正在使用MySQL,並且有一個表具有超過30 000行,我正在查詢該表以供以后在頁面上使用。 問題是該查詢需要花費1秒鍾以上的時間才能執行,並且我需要加快查詢速度,因為該網站的用戶一直在抱怨它。

這是查詢:

     SELECT `partners`.`id`, 
            `partners`.`first_name`, 
            `partners`.`url`, 
            `partners`.`country`, 
            `partners`.`city`, 
            `partners`.`followers` AS `amount_of_followers`, 
            `partner_user_brand`.`brand_id` AS `brand`, 
            MAX(posts.code_start) AS code_start, 
            MAX(posts.code_end) AS code_end, 
            `partners`.`platforms`, 
            (    SELECT sales 
                   FROM posts 
                  WHERE partner_id = partners.id 
               ORDER BY posts.code_end DESC 
                  LIMIT 1
            ) AS latest_sale, 
            `partners`.`email`, 
            `partners`.`gender`, 
            `partner_brand_status`.`status_id`, 
            `partners`.`school`, 
            (       SELECT COALESCE(SUM(sales), 0) 
                      FROM posts 
                     WHERE partner_id = partners.id
            ) AS tsales, 
            COALESCE(MAX(posts.sales), 0) AS best_sale, 
            IF(partner_user_brand.brand_id=1, RIGHT(contacted, 10), RIGHT(nv_contacted, 10)) AS last_contact 
       FROM `partners` 
  LEFT JOIN `posts` 
         ON `partners`.`id` = `posts`.`partner_id` 
 INNER JOIN `partner_user_brand` 
         ON `partners`.`id` = `partner_user_brand`.`partner_id` 
 INNER JOIN `partner_brand_status` 
         ON `partners`.`id` = `partner_brand_status`.`partner_id` 
        AND `partner_user_brand`.`brand_id` = `partner_brand_status`.`brand_id` 
   GROUP BY `partners`.`id`, 
            `partner_user_brand`.`brand_id`

有沒有辦法縮短它或使其更快?

此外,是否有快速的方法來計算查詢結果?

您可以查看以下內容,這可能會對性能有所幫助:

執行計划 :調查查詢執行計划。 這將是性能觀點的最佳起點有關執行計划的更多信息

索引 :可以通過在要進行連接的列或where部分中的列上添加索引來提高性能。

分頁 :您如何提供數據同樣重要。 用戶不會一次查看3000行。 因此,您可以添加分頁以提高性能

重新設置查詢格式:除上述幾點外,請刪除單個查詢中的多項選擇。 嘗試為此使用聯接

select 
    a.* 
    ,posts.sales as LatestSale
from ( 
SELECT `partners`.`id`, 
        `partners`.`first_name`, 
        `partners`.`url`, 
        `partners`.`country`, 
        `partners`.`city`, 
        `partners`.`followers` AS `amount_of_followers`, 
        `partner_user_brand`.`brand_id` AS `brand`, 
        MAX(posts.code_start) AS code_start, 
        MAX(posts.code_end) AS code_end, 
        `partners`.`platforms`, 
        `partners`.`email`, 
        `partners`.`gender`, 
        `partner_brand_status`.`status_id`, 
        `partners`.`school`, 
        SUM(posts.sales) AS tsales, 
        COALESCE(MAX(posts.sales), 0) AS best_sale, 
        IF(partner_user_brand.brand_id=1, RIGHT(contacted, 10), RIGHT(nv_contacted, 10)) AS last_contact 
   FROM `partners` 
LEFT JOIN `posts` 
     ON `partners`.`id` = `posts`.`partner_id` 
INNER JOIN `partner_user_brand` 
     ON `partners`.`id` = `partner_user_brand`.`partner_id` 
INNER JOIN `partner_brand_status` 
     ON `partners`.`id` = `partner_brand_status`.`partner_id` 
    AND `partner_user_brand`.`brand_id` = `partner_brand_status`.`brand_id` 
  GROUP BY `partners`.`id`, 
        `partner_user_brand`.`brand_id`) as a 
left outer join posts 
on a.id = posts.partner_id
 and a.code_end = posts.code_end

可能會有所幫助,因為它會阻止您運行查詢以獲取每行的最后一筆交易,而是執行大部分查詢,然后再次加入帖子以獲取最新的帖子值-加入ID和已建立的最新帖子code_end值用於code_end列

但是還要檢查執行計划等。如果語法有點偏離t-sql,這是我的日常工作。

概括地說,該語句的邏輯執行:如果在主查詢中的FROM之前有子查詢(從..中選擇值),則該子查詢將在主查詢之后以及主查詢返回的每一行中執行。 我的修改仍將首先執行您的主查詢,然后將其連接到posts表,但它只會對所有行執行一次(afaik),而不是對每一行執行一次。 -但這就是我在這種情況下的默認設置,請檢查執行計划以獲取准確的信息

暫無
暫無

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

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