数据库

关系型数据库(MySQL)和NOSQl(mongoDB)

关系型数据库

数据库索引的作用和原理

首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delet的每次执行,字段的索引都必须重新计算更新。

查看全部

实战

leetcode-cn

练习资源一

汇总数据

  • AVG忽略值为NULl的行
  • Count有两种用法.count(*)统计所有行,不管行中具体的值,空值也算。count(column),对特定列进行计数,忽略NULL值
  • MIN/MAX除了可以返回最大最小数值,也可以返回最大最小日期,甚至包括非数值,这个可以自己探索,这两个都会忽略NULL值
  • AVG( DISTINCT columns)和Count(DISTINCT columns) 加上DISTINCT可以统计该列不同值得聚合结果
  • AVG,MIN,MAX,COUNT,SUM 这5个聚集函数非常高效,直接使用这个比在应用中计算高效的多。

分组

  • 如果有分组,也就是有Group By 语句则只能用Having,因为只有Having才能过滤分组。

  • Having是在分组后进行过滤,Where是在分组前进行过滤。Having是在这个级别过滤,where是在这个级别过滤

  • Group By 子句必须出现在where子句之后,order by 子句之前

Python 读写 MySQL

通过PyMySQL来完成对MySQL的操作。官网地址

Pandas 读写MySQL

pandas 可以DataFrame的各种函数,可以更加方面的来完成各种数据处理工作。
常用的函数如下:

  • pandas.read_sql_table 将表读成一个DF
  • pandas.read_sql_query 用SQL语句的查询结果生成一个DF
  • DataFrame.to_sql 将DF写入数据库中

上述工作需要依赖SQLAlchemy.具体可以参考官网,SQLAlchemy是Python经典的ORM工具,具体驱动还需要依赖PyMySQL。

编码问题

在创建engine的时候可以指定charset,具体看官网链接

NOSQL

安装

参考官网
MacOS可以直接通过 HomeBrew 安装.具体参考上面链接

The Little MongoDB Book

快速学习mongoDB 的好书 The Little MongoDB Book

mongoDB 导入 csv

  1. 将数据上传到 mongoDB 服务器上
  2. 执行下面命令导入数据
1
2
3
4
5
6
7
8
9
10
11
12
mongoimport --host 172.30.1.38 --port 27017  -d <databaseName> -c <collectionName> --type csv --headerline  --file  <csvName>  (不需要<>)
d:数据库名

c:collection名

type:文件类型,指明是csv文件

headline:指明第一行是列名,不需要导入

file:csv文件路径及名字

更多参数请执行 mongoimport --help查看

如果excel里面有中文、特殊符号,会抛出以下异常:exception:Invalid UTF8 character detected
此时,执行mongoimport命令前,您需要先将该csv文件编码转为 utf-8
方法:将 sample.csv 上传到 Linux系统,然后利用iconv 命令转换编码:
iconv -f gbk -t UTF-8 sample.csv > sample.csv

PyMongo基本操作(Python 操作 MongoDB)

PyMongo tutorial