簡體   English   中英

如何提高pandas中mysql查詢的處理速度

[英]How to increase the processing speed of mysql query in pandas

我在元組中的 ID 如下

ids = tuple(df1['ids'])

ids 有 100k 行

我的查詢

q_id=f'''

SELECT id, COUNT(*) AS Count 
FROM NEWS 
WHERE status = 'JOINED' AND id IN {ids} 
GROUP BY 1

connection是一種使用用戶名和密碼建立連接的方法

df2 = connection('mysqldb', q_id)

獲得結果需要太多時間。 如何提高pandas中mysql查詢的處理速度?

請提供SHOW CREATE TABLE news

它需要包括

 INDEX(status, id)

idPRIMARY KEY嗎? 如果是這樣,那么這是一個相當奇怪的查詢:

SELECT id, COUNT(*) AS Count 
    FROM NEWS 
    WHERE status = 'JOINED'
      AND id IN {ids} 
    GROUP BY 1

因為所有的計數都是“1”。 (這是因為PRIMARY KEY是“唯一的”)。

要找出這些 id 中有多少'JOINED ':

SELECT COUNT(*) AS Count 
    FROM NEWS 
    WHERE status = 'JOINED'
      AND id IN {ids} 

要找出哪些id 是'JOINED ':

SELECT id 
    FROM NEWS 
    WHERE status = 'JOINED'
      AND id IN {ids} 

為了速度,組合查詢幾乎總是更有效。

您的問題意味着涉及三個步驟(3 個單獨的 SQL 查詢):

  1. 獲取 ID 列表,
  2. 檢查 ids(顯示的查詢查找哪些 ids 是“加入的”),
  3. 以某種方式使用這些 ID。

更好的是將查詢組合在一起。 一個簡單的方法是讓對 id 的搜索成為一個“派生”表,該表為進程的其余部分提供 id。 通常最好將查詢進一步混合在一起。

(如果我們知道其余的處理過程,我們也許能夠提供具體的建議。)

您的查詢為每個 id 生成01 如果你得到NULLid怎么辦? 或者找到“加入”的ids並扔掉其余的? 這樣做可以加快您的查詢速度。 但是,它提供了連接的 id,而不是 0 或 1:

SELECT id FROM NEWS WHERE status = 'JOINED' AND id IN(...);

這將有助於提高效率:

INDEX(status, id)

在下面的兩個示例中,我專注於合並第二個和第三個查詢。

SELECT ...
    FROM ...
    LEFT JOIN ( SELECT id FROM NEWS WHERE status = 'JOINED' ) x
            USING(id);

有了這個,您可以使用id或獲得一個NULL表示它沒有“加入”。

也可以這樣寫

SELECT ...
    FROM mytable AS a
    WHERE EXISTS ( SELECT 1 FROM NEWS
            WHERE status = 'JOINED'
              AND id = a.id )

這實際上會產生01 ,被視為falsetrue

目前尚不清楚 LEFT JOIN 還是 EXISTS 會更好。 我們需要查看id列表的來源和您的COUNTs的使用。 注意:在任何一種情況下,3 個查詢中的第 2 個都有效地組合在一起,很可能會更快。

一些 3rd 方包傾向於將 SQL 任務分解為這樣的小步驟(獲取 ID、檢查它們、使用它們)。 這使得包更簡單,但對於“大”的數據集來說效率低下。

如果你有 ids 作為表,那么你可以使用 where exists(從 ids where ids.key = NEWS.Key 中選擇 1)

暫無
暫無

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

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