最近在工作中,进行大量的数据处理,使用的是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名的订单详情信息,包括订单表全部字段和用户表全部字段(我们需要对土豪用户进行详细的了解)。

201806 数据处理 SQL、python、shell 哪家强...速度PK(上篇)的更多相关文章

  1. 【xlwings1】Python-Excel 模块哪家强

    Python-Excel 模块哪家强?   0. 前言 从网页爬下来的大量数据需要清洗? 成堆的科学实验数据需要导入 Excel 进行分析? 有成堆的表格等待统计? 作为人生苦短的 Python 程序 ...

  2. 图表制作软件哪家强?当属火爆商业智能圈的Smartbi

    图表制作软件选择多吗? 相对来说,统计图表制作软件还是很多的.比如常见的百度图说还有wps和excel都是可以制作好看的统计图的.关键就是看是在怎样的业务场景下使用.一般情况下,如果你对Excel足够 ...

  3. 百度 谷歌 Twitter,这么多短链接服务(Short Url)究竟哪家强?

    一.短链接是什么 url=HPqdQ5VR3vA39x7ZWoWyNzwWnsDhTbh66BTpdzsJLroBDzFRm4JV-G818Zc027uZrwe7zxtxnD4H2FUahftpUK& ...

  4. 自动化冒烟测试 Unittest , Pytest 哪家强?

    前言:之前有一段时间一直用 Python Uittest做自动化测试,觉得Uittest组织冒烟用例比较繁琐,后来康哥提示我使用pytest.mark来组织冒烟用例 本文讲述以下几个内容: 1.Uni ...

  5. PAT 挖掘机技术哪家强

    为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即参赛人数.随后 N  ...

  6. PAT 1032. 挖掘机技术哪家强(20)

    为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每行给出一位 ...

  7. PAT乙级 1032. 挖掘机技术哪家强(20)

    1032. 挖掘机技术哪家强(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 为了用事实说明挖掘机技术到底 ...

  8. PAT (Basic Level) Practise:1032. 挖掘机技术哪家强

    [题目链接] 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行 ...

  9. .NET ORM 哪家强

    ORM到底哪家强? 很多人都想知道这个问题,自已也没测试过,只能道听途说. 闲的无聊就将几个ORM拿出来比一比,假如怀疑测试代码有问题可以将它下载下来慢慢研究. 参赛ORM 1.SqlSugar:是一 ...

随机推荐

  1. [Android]使用Spring for Android改善数据交互流程

    如果开发一个和服务端有数据交互android应用,流程通常是这样的:界面收集用户数据之后,将它转换成JSON或者XML格式的字符串,以HTTP的方式提交给服务端,获得返回的文本数据,再将数据解析为ja ...

  2. [py]python操作zookeeper

    参考: https://blog.csdn.net/heizistudio/article/details/79568188 1.安装zookeeper zookeeper-3.4.6.tar.gz ...

  3. mysql语句,插入id随机生成

    insert into 表名 VALUES(uuid(),…) 还有一个uuid_short(),只有数字 insert into 表名 VALUES(uuid_short(),…)

  4. JS 变量和函数提升 全局变量和局部变量

    变量提升 1. var a = 10; function test() { a = 100; console.log(a); console.log(this.a); var a; console.l ...

  5. jupyter notebook 动态图显示

    直接在import matplotlib.pyplot as plt 后面加%matplotlib,或者%matplotlib auto就可以通过弹出窗口的形式显示图片

  6. webstorm编辑器使用

    1.自动生成vue文件模板,如图

  7. python之dict(或对象)与json之间的互相转化

    在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作. 在Python中自带json库.通过import json导入. 在json模块有2个方法, loads():将 ...

  8. Centos7 下yum安装mysql

  9. C#通过Ado.net对连接数据库并进行添加删除等常规操作的代码

    如下资料是关于C#通过Ado.net对连接数据库并进行添加删除等常规操作的内容. static string sqlcon = "server=.;database=;Integrated ...

  10. Java -- 构造函数 & this & 方法重写和方法重载的区别

    JAVA: 今天总结一下构造方法.关键字.方法重载和方法重写的异同   一.构造方法(构造函数)1.构造方法的作用:一是创建对象时调用构造方法创建对象,二是可以初始化多个属性 [学生类创建一个学生对象 ...