201806 資料處理 SQL、python、shell 哪家強...速度PK(上篇)
最近在工作中,進行大量的資料處理,使用的是mysql5.7.22,發現當資料量級達到幾十萬之後,SQL執行速度明顯變慢。尤其是當多個表join時,於是就嘗試用python pandas進行資料處理,發現執行速度明顯比SQL執行速度快。於是,決定比較一下千萬資料量級之下,SQL、pandas、shell在資料處理上的優劣勢。
配置:ubuntu系統64位,8G記憶體,intel i7處理器
軟體環境:mysql5.7.22 , python3下的pandas , shell
測試資料:
資料是使用python隨機生成的,訂單表的時間跨度是2015年-2018年,共計2000萬行,csv檔案大小是909M;使用者表共計500萬行,csv檔案大小是284M。
表1:訂單表 orderid、ordertime、uid、amount、status
表2:使用者表 uid、gender、birthday、mobile、email
使用shell、pandas的話,直接訪問,兩個表的csv檔案,逗號分隔符;mysql的話,將資料先匯入到資料庫。
一、單表查詢 mysql PK shell
1、計數
shell完勝!
(注:有些人有誤區,認為count(*) 比 count(欄位名) 慢,實際上,count(*)是最快的,count(欄位名) 該欄位在表中的位置決定執行速度,越靠後越慢,已親測!)
2、求和
shell 和 SQL 的速度差不多!
3、查詢
shell我們用了兩種寫法,可以看到,當需要對檔案進行列分割的時候,速度明顯慢了很多。
使用SQL查詢,因為orderid是表的主鍵,對於有索引的列進行查詢的時候,速度還是非常快的。(加索引和不加索引的區別,非常的大,尤其是當資料量級大的時候)。
我們再來看一下,對不加索引的列進行查詢的話,SQL的速度怎麼樣。
user表是500萬的資料量,這樣看來,進行查詢時,列加索引和不加索引的區別還是挺明顯的。
小結:當SQL對加索引的鍵,進行篩選查詢時,SQL的速度是優於shell的;但是,如果對加索引的列進行函式操作時,還有對不加索引的列進行查詢時,速度會明顯慢很多。
4、分類彙總 按月彙總,每個月下單數量、金額,成交訂單數量、金額
根據年份進行彙總之後,都將資料儲存到表裡,這裡shell又是完勝哈!
5、文字處理 不同型別郵箱、不同級別 使用者數量分佈
shell寫法1:因為使用uniq -c 需要先用sort進行排序,所以速度明顯比較慢,要用到8s左右。
shell寫法2:使用awk來進行彙總,速度較uniq -c有了明顯提升。
SQL:執行速度將近6s,還是挺快的,我還以為對文字進行字串進行擷取會比較慢呢,哈哈。
shell寫法2,完勝!
單表查詢總結:
(1)使用SQL的話,where用到的列加索引速度比較快;當需要對其進行函式運算時,或者當欄位沒有加索引時,速度就慢很多,因為需要全表遍歷;
(2)資料量級較大時,使用shell進行簡單的單表查詢,速度明顯優於SQL。
(3)使用python的pandas,因為需要現將資料讀取到記憶體中,這部分會耗費一部分時間,所以簡單的一句可以搞定的查詢,我一般還是比較傾向於使用SQL和shell。但是,當需要,進行多個大表關聯進行運算時,pandas的速度還是非常快的,這部分我們下篇見。
二、多表查詢(下次更新...寫不動了...)
場景1:各個級別使用者數量,以及在每一年下單的使用者數量,訂單量,訂單金額,成交訂單量,成交訂單金額。
場景2:獲取2018年,每個月成交訂單總金額在前5名的訂單詳情資訊,包括訂單表全部欄位和使用者表全部欄位(我們需要對土豪使用者進行詳細的瞭解)。