[英]Slow working on join query same table when large of dataset ( want to faster then )?
該查詢在下表中維護
SELECT A.XXX as XXX,B.total_result as total_cost
FROM TABLE as A
LEFT JOIN
(
SELECT XXX,sum(`click`)*price as total_result
FROM TABLE
WHERE main_id = '1' AND (DATE(`click_time`) BETWEEN '2017-11-01' AND '2017-11-30' OR `click_time` IS NULL)
GROUP BY XXX,price
) B ON B.`XXX` = A.`XXX`
where B.click IS NOT NULL
GROUP BY A.XXX
LIMIT 0,20
表
k_id main_id XXX click price click_time
1 1 aaa 1 0.25 2017-11-05
2 1 bbb 1 0.36 2017-11-05
3 1 bbb 1 0.45 2017-11-05
4 1 aaa 1 0.36 2017-11-05
5 1 ccc 1 0.98 2017-11-05
6 1 bbb 1 0.55 2017-11-05
7 1 aaa 1 0.25 2017-11-05
8 1 ccc 1 0.98 2017-11-05
9 1 aaa 1 0.25 2017-11-05
10 1 bbb 1 0.45 2017-11-05
我想此查詢修改工作此表的大型數據集
您可以做一些事情來優化此查詢。
在查詢方面:
盡可能避免排序 -我可以看到子查詢中有GROUP BY子句,但沒有ORDER BY子句。 如果您不太在意子查詢中結果的順序,請在子查詢的末尾添加以下order子句,這將指示MySQL不要使用默認順序並提高性能。
ORDER BY NULL
====
避免在可能被索引的列上調用函數 -因為它不允許MySQL使用該列上的索引。 以下情況:
DATE(`click_time`) BETWEEN '2017-11-01' AND '2017-11-30'
可以對此進行修改,以避免在索引列上使用DATE函數,而僅對常量值使用函數:
click_time >= DATE('2017-11-01') AND click_time < (DATE('2017-11-30') + INTERVAL 1 DAY)
====
不要在查詢中使用OFFSET值 -您可以使用替代方法來代替LIMIT X,Y,從而在MySQL中使用offset更快地分頁 。
===
適當時使用數字值 -在將數字列與字符串進行比較時,您將強制MySQL將每一行的列值從數字轉換為字符串,然后才執行比較。 因此,在條件main_id ='1'中,如果main_id是數字列,則條件應為:
main_id = 1
代替:
main_id = '1'
===
另外,如果您可以提供架構結構,則可以為這種情況推薦適當的索引。
順便說一句,我是從此在線MySQL查詢優化器獲得建議的,因此隨時在此處輸入您的查詢和模式以獲取索引建議(您未提供模式結構,否則我會提供索引建議)以及)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.