1. 程式人生 > >201806 資料處理 SQL、python、shell 哪家強...速度PK(上篇)

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名的訂單詳情資訊,包括訂單表全部欄位和使用者表全部欄位(我們需要對土豪使用者進行詳細的瞭解)。