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