[英]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)
id
是PRIMARY 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 查詢):
更好的是將查詢組合在一起。 一個簡單的方法是讓對 id 的搜索成為一個“派生”表,該表為進程的其余部分提供 id。 通常最好將查詢進一步混合在一起。
(如果我們知道其余的處理過程,我們也許能夠提供具體的建議。)
您的查詢為每個 id 生成0
或1
。 如果你得到NULL
或id
怎么辦? 或者找到“加入”的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 )
這實際上會產生0
或1
,被視為false
或true
。
目前尚不清楚 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.