第一本:机械工业出版社的数据挖掘与分析实战

下面附上自己整理的笔记脑图。有空可以复习看看

附上pdf版供下载
链接
提取码 jrzd

第二本:电子工业出版社的《谁说菜鸟不会数据分析》

整理了一下框架。

第三本:廖雪峰数据库sql教程

为什么要有数据库

1、随着应用程序功能越来越复杂,数据量越来越大,面临2个问题
第一:读写文件并解析出数据需要大量重复代码
第二:成千上万的数据中快速查询出指定数据需要复杂逻辑
第三:如果每个应用程序都各自写自己的读写数据代码,一方面效率低,易错。另一方面,每个应用程序访问数据的接口各不相同。
2、数据库作为专门管理数据的软件,通过数据库提供的接口来读写数据

数据模型

1、数据库按数据结构来组织、存储和管理数据,共有三种模型:层次模型、网状模型、关系模型



最终关系模型获得最广泛运用。

数据类型

INT	整型	4字节整数类型,范围约+/-21亿
BIGINT	长整型	8字节整数类型,范围约+/-922亿亿
REAL	浮点型	4字节浮点数,范围约+/-1038
DOUBLE	浮点型	8字节浮点数,范围约+/-10308
DECIMAL(M,N)	高精度小数	由用户指定精度的小数,例如,DECIMAL(20,10)表示一共20位,其中小数10位,通常用于财务计算
CHAR(N)	定长字符串	存储指定长度的字符串,例如,CHAR(100)总是存储100个字符的字符串
VARCHAR(N)	变长字符串	存储可变长度的字符串,例如,VARCHAR(100)可以存储0~100个字符的字符串
BOOLEAN	布尔类型	存储True或者False
DATE	日期类型	存储日期,例如,2018-06-22
TIME	时间类型	存储时间,例如,12:20:59
DATETIME	日期和时间类型	存储日期+时间,例如,2018-06-22 12:20:59

SQL是什么

是结构化查询语言的缩写,用来访问和操作数据库系统
DDL(data definition language):允许用户定义数据,创建表、删除、修改表结构,通常此类由数据库管理员执行
DML(data manipulation language):为用户提供添加、删除、更新数据的能力,
DQL(data query language):允许用户查询数据,
内含常用的数据引擎:
InnoDB:由Innobase Oy公司开发的一款支持事务的数据库引擎,2006年被Oracle收购;
MyISAM:MySQL早期集成的默认数据库引擎,不支持事务。

事务

通俗点就是我们操作数据库的几条sql,要么全部执行成功,要不全不成功。(事务是为了解决数据安全问题)

事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。

事务的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。
事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
事务的持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确

主键、索引

主键:能够通过某字段唯一区分出不同的记录,这个字段被称为主键。
联合主键:

索引:是数据库中对某一列或多值进行预排序的数据结构。
创建索引:alter table A add index score
唯一索引:在数据表中,例如身份证号、邮箱地址,因为有具体的业务含义,又不能用来做主键,又需具有唯一性约束,就得给该列添加唯一索引。
指定索引:数据库会自动分析查询语句,很多时候数据库查询优化器,不一定总能使用最优索引,我们可以通过force index 强制查询
例如
select * from students force index(class_id) where id=1 order by id

分页查询

limit M offset N
每页3条,获取第1页
用limit 3 offset 0
每页3条,获得第2页
limit 3 offset 3

连接查询

inner 取交集
right join =right outer join 返回右表都存在的行。如果某一行仅在右表存在,那么结果集就会以NULL填充剩下的字段
left join=LEFT OUTER JOIN则返回左表都存在的行
full outer join 会把两张表所有记录选择出来

insert

insert into table(column1,2,3…)values(值1,值2,…)

update

update table set 字段1=值1, 字段2=值2, … WHERE …;
在UPDATE语句中,更新字段时可以使用表达式。例如,把所有80分以下的同学的成绩加10分:

UPDATE students SET score=score+10 WHERE score<80;
-- 查询并观察结果:
SELECT * FROM students;

delete

DELETE FROM <表名> WHERE …;
DELETE FROM students WHERE id=1;

CREATE TABLE

±---------±------------------------------------------------------+
| students | CREATE TABLE students ( |
| | id bigint(20) NOT NULL AUTO_INCREMENT, |
| | class_id bigint(20) NOT NULL, |
| | name varchar(100) NOT NULL, |
| | gender varchar(1) NOT NULL, |
| | score int(11) NOT NULL, |
| | PRIMARY KEY (id) |
| | ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 |
±---------±------------------------------------------------------+

第四本:吴恩达机器学习–讲讲降维

降维是什么:

1、冗余的特征,当你有成百上千的数据特征,你需要选择最需要最准确表达的特征。
2、简单来说通过投影,将数据投影至一个直线上,就是一种降维。用来压缩数据,让算法运行的更快,减少空间。

主成分分析

1、简单来说就是找一个低维平面(线、面、体)将数据投影在上面,使得数据到投影点的距离平方最小(投影误差),PCA就是找出这个面。最小化投影误差
2、在运用主成分分析前,正常都是需要均值标准化和特征规范化。
3、与线性回归的区别

聚类算法

k-means
随机生成若干个距离最远的点, 将每个数据分配给最近的点
重新计算中心点,再次将数据分配到新的中心点。
直到最终迭代,聚类中心再也不变了,就是最终结果
初始化聚类中心
1、找到较好的局部最优解,通常多次随机初始化,正常在2-10类能很好的起到分类效果
选择聚类数量
肘部曲线,但常常没有那么准确的拐点,
另一种是结合业务意义进行分析,考虑下游目的。

第五本:深入浅出MYSQL

MYSQL存储引擎

1、支持的引擎包括:MyISAM\InnoDB\MERGE等等
2、通过两种方法查询:
第一种:SHOW ENGINES
第二种: SHOW VARIABLES LIKE ‘have%’
3、在创建表时可以通过增加ENGINE来设置

CREATE TABLE ai (
 i bigint(20) NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (i)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;



CREATE TABLE country (
 country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
 country VARCHAR(50) NOT NULL,
 last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (country_id)
)ENGINE=InnoDB DEFAULT CHARSET=gbk

4、几种引擎对比

5、主要介绍两个

  • MyISAM不支持事务、也不支持外键,优势是访问速度快,表损坏可能导致数据库异常重新启动,需要尽快修复并尽可能地确认损坏的原因。
  • InnoDB提供了具有提交、回滚和崩溃恢复能力的事务安全,但他的占用磁盘空间相对更大

6、怎么选择合适的引擎

  • 如果应用以读和插入操作为主,很少的更新和删除操作,对事务的完整性、并发性要求不是很高,选择MyISAM,其在Web、数据仓储和其他应用环境下最常使用
  • InnoDB用于事务处理应用程序,支持外键,对事务完整性有较高要求,除了插入、查询还包括很多更新、删除操作,类似计费系统,财务系统常常都是用它作为选择
  • MERGE:用于将一系列等同的 MyISAM 表以逻辑方式组合在一起,并作为一个对象引用它们。MERGE 表的优点在于可以突破对单个 MyISAM 表大小的限制,并且通过将不同的表分布在多个磁盘上,可以有效地改善MERGE表的访问效率。这对于诸如数据仓储等VLDB环境十分适合。

索引的设计和使用

1、MyISAM和InnoDB存储的表默认创建的都是Btree,但支持前缀索引,即对前N个字符创建索引
2、创建索引语法:create index index_name on table_name(index_col_name,…)
删除索引:DROP INDEX index_name ON tbl_name
3、设计索引的原则:

  • 最适合索引的列是在where中或者连接中的指定列,而不是在select 关键字后选择的列
  • 索引列的基数越大,索引效果越好,例如不要再性别列创建索引
  • 不要过度索引,
  • 尽量自己指定主键

BTREE 索引与 HASH 索引

MEMORY 存储引擎的表可以选择使用 BTREE 索引或者 HASH 索引,两种不同类型的索引各有其不同的适用范围。HASH 索引有一些重要的特征需要在使用的时候特别注意,如下所示。

  • 只用于使用=或<=>操作符的等式比较。
  • 优化器不能使用 HASH 索引来加速 ORDER BY 操作。
  • MySQL 不能确定在两个值之间大约有多少行。如果将一个 MyISAM 表改为 HASH 索引的 MEMORY 表,会影响一些查询的执行效率。
  • 只能使用整个关键字来搜索一行。
    而对于 BTREE 索引,当使用>、<、>=、<=、BETWEEN、!=或者<>,或者 LIKE ‘pattern’(其 中’pattern’不以通配符开始)操作符时,都可以使用相关列上的索引。

下列范围查询适用于 BTREE 索引和 HASH 索引:

SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20);

下列范围查询只适用于 BTREE 索引:

SELECT * FROM t1 WHERE key_col > 1 AND key_col < 10;
SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'lisa' AND 'simon';

SQL优化

1、利用explain分析低效的SQL执行计划
例如:

explain select sum(moneys) from sales a,company b where apany_id = b.id and a.year = 2006;


简单解释

创建索引注意点

1、使用索引

  • 创建复合索引,对于多列索引,只要查询到最左边的列,索引就会被使用
    例:按 company_id,moneys 的顺序创建一个复合索引,具体如下:
create index ind_sales2_companyid_moneys on sales2(company_id,moneys);

2、使用Like的查询,后面是常量且只有%号不在第一个字符内,索引才会被使用
例如:

mysql> explain select * from company2 where name like '%3'\G;
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: company2
 type: ALL
possible_keys: NULL
 key: NULL
 key_len: NULL
 ref: NULL
 rows: 1000
 Extra: Using where
1 row in set (0.00 sec)
mysql> explain select * from company2 where name like '3%'\G;
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: company2
 type: range
 possible_keys: ind_company2_name
 key: ind_company2_name
 key_len: 11
 ref: NULL
 rows: 103
 Extra: Using where
1 row in set (0.00 sec)

常用的几种优化

①大批量插入数据
针对MyISAM 表,用load data infile…这种语句,耗时比较少


针对INnoDB,上面方法没有很高效率,而是通过导入的时候数据按照主键的顺序排列能提高导入效率。
第二是在导入数据前执行 SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。

②优化order by 语句

在某些情况中,MySQL 可以使用一个索引来满足 ORDER BY 子句,而不需要额外的排序。WHERE 条件和 ORDER BY 使用相同的索引,并且 ORDER BY 的顺序和索引顺序相同,并且ORDER BY 的字段都是升序或者都是降序。


③优化OR语句
对于含有 OR 的查询子句,如果要利用索引,则 OR 之间的每个条件列都必须用到索引;如果没有索引,则应该考虑增加索引。
④FORCE INDEX
为强制 MySQL 使用一个特定的索引,可在查询中使用 FORCE INDEX 作为 HINT。例如,当不强制使用索引的时候,因为 id 的值都是大于 0 的,因此 MySQL 会默认进行全表扫描,而不使用索引,如下所示:

mysql> explain select * from sales2 where id > 0
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: sales2
 type: ALL
possible_keys: ind_sales2_id
 key: NULL 
 key_len: NULL
 ref: NULL
 rows: 1000
 Extra: Using where
1 row in set (0.00 sec)

但是,当使用 FORCE INDEX 进行提示时,即便使用索引的效率不是最高,MySQL 还是选择使用了索引,这是 MySQL 留给用户的一个自行选择执行计划的权力。加入 FORCE INDEX 提示后再次执行上面的 SQL:

mysql> explain select * from sales2 force index (ind_sales2_id) where id > 0
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: sales2
 type: range
possible_keys: ind_sales2_id
 key: ind_sales2_id 
 key_len: 5
 ref: NULL
 rows: 1000

保持渴求,不要沉寂

更多推荐

【读书笔记】python 数据挖掘与分析实战、深入浅出mysql、廖雪峰数据库sql教程、吴恩达机器学习--讲讲降维