簡體   English   中英

當有大量數據集時,聯接查詢同一表的工作速度變慢(想要更快然后)嗎?

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

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