目录
13. 批量插入1000万条数据到mysql数据库表... 6
第一范式:表中每个字段都不能再分。
第二范式:满足第一范式并且,非主属性必须完全依赖于候选键。
第三范式:满足第二范式并且,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)(也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。)。
BCNF范式:第三范式的基础上,是第一范式且每个属性都不传递依赖于R的候选键。任何非主属性不能对候选键之外的属性依赖,即 只要 x->y 则x是键(码,候选键)。排除了任何属性对码的传递依赖与部分依赖,所以R∈3NF。在三范式基础上消除了对主属性的依赖。
第四范式:设R是一个关系模型,D是R上的多值依赖集合。如果D中存在凡多值依赖X->Y时,X必是R的超键,那么称R是第四范式的模式。
例子参考:https://blog.csdn.net/dove_knowledge/article/details/71434960
事务具有四大特性:一致性、原子性、隔离性、持久性。
数据库事务是指:几个SQL语句,要么全部执行成功,要么全部执行失败。比如银行转账就是事务的典型场景。
数据库事务的三个常用命令:Begin Transaction、Commit Transaction、RollBack Transaction。
MySQL提供4种隔离级别:
READ UNCOMMITED (读未提交)// 允许幻读,脏读及不可重复读;
READ COMMITED (提交后读)// 允许幻读和不可重复读,不允许脏读;
REPEATABLE READ (可重读)// 允许幻读,不允许脏读和不可重复读;
SERIALIZABLE READ (序列化)// 不允许幻读,脏读及不可重复读;
视图实际上是在数据库中通过Select查询语句从多张表中提取的多个表字段所组成的虚拟表。
视图并不占据物理空间,所以通过视图查询出的记录并非保存在视图中,而是保存在原表中。
通过视图可以对指定用户隐藏相应的表字段,起到保护数据的作用。
在满足一定条件时,可以通过视图对原表中的记录进行增删改操作。
创建视图时,只能使用单条select查询语句。
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
索引分为:聚集索引、非聚集索引、唯一索引等。
一张表可以有多个唯一索引和非聚集索引,但最多只能有一个聚集索引,因为真实数据的物理顺序只可能是一种。索引可以包含多列。
合理的创建索引能够提升查询语句的执行效率,但降低了新增、删除操作的速度,同时也会消耗一定的数据库物理空间。
漫谈数据库索引:http://kb.cnblogs.com/page/45712/
MySQL索引分类:https://segmentfault.com/q/1010000003832312
索引的类型(物理存储角度):
A)聚集索引,表数据存储顺序按照索引的顺序来存储的。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。
B)非聚集索引,表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,该层紧邻数据页,其行数量与数据表行数据量一致。
如果一张表没有聚集索引,那么它被称为“堆集”(Heap)。这样的表中的数据行没有特定的顺序,所有的新行将被添加的表的末尾位置。
创建一个 n 个数据列的组合索引,实际上就创建了 n 个索引。一个复合索引在工作时,就相当于 n 个索引,因为索引中最左边的数据列集合能够用于匹配数据行,这样的一个集合就被称为“最左边的前缀”。
当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了,这个是非常重要的性质,即索引的最左匹配特性。
什么是B树?
平衡的 m 路查找树,"B"表示平衡。
- 根结点至少有两个子女;
- 每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m – 1, 关键字从小到大排列;
- 除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:┌m/2┐ <= k <= m ;
- 所有的叶子结点都位于同一层。
设计动机:
平衡二叉树的查找效率是非常高的,并可以通过降低树的深度来提高查找的效率。但是当数据量非常大,树的存储的元素数量是有限的,这样会导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。另外数据量过大会导致内存空间不够容纳平衡二叉树所有结点的情况。B树是解决这个问题的很好的结构采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。
上面叙述的问题,引入高速缓存来解决。
事实1 : 不同容量的存储器,访问速度差异悬殊。
事实2 : 从磁盘中读 1 B,与读写 1KB 的时间成本几乎一样( 以页(page)或块(block)为单位,使用缓冲区),并且读写数据一般都具有局部性
为什么数据库索引用B+树?
- MySQL中的数据一般是放在磁盘中的,读数很慢。所以希望尽量少的访问磁盘。即每次读写磁盘时都尽可能多的读数据。B树的多叉设计很好满足。
- B树的特点,B树的节点大小与磁盘页一样大,这么大的分支因子,使得B树树深较小,读写磁盘次数大大减少。
- B+树只在叶子结点存放数据,进一步压缩树的高度,且叶子节点链表形式,方便顺序遍历范围查询。
B树和B+树的区别?
3点区别:数据项指针、链表、索引项。
- B+树改进了B树, 让内结点只作索引使用, 去掉了其中指向datarecord的指针, 使得每个结点中能够存放更多的key,这样就意味着存放同样多的key树的层高能进一步被压缩, 使得检索的时间更短.
- 底部的叶子结点是链表形式, 因此也可以实现更方便的顺序遍历。
- B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。
B+树的优点:
1. 非叶子节点不会带上ROWID,这样,一个块中可以容纳更多的索引项,一是可以降低树的高度。二是一个内部节点可以定位更多的叶子节点。
2. 叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点不停的往返移动。
B树的优点:对于在内部节点的数据,可直接得到,不必根据叶子节点来定位。
连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件内连接---(典型的连接运算,使用像 = 或 < > 之类的比较运算符)。包括相等连接和自然连接。
https://baike.baidu.com/item/%E8%87%AA%E7%84%B6%E8%BF%9E%E6%8E%A5
等值连接:SELECT * FROM customers inner join orders on customers.id = orders.id;
自然连接(内连接):一种特殊的等值连接,它要求两个关系进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。SELECT * FROM customers natural join orders;
外连接---外连接可以是左向外连接、右向外连接或完整外部连接。
交叉连接---交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。
等值连接和自然连接的区别?
- 等值连接中不要求相等属性值的属性名相同,而自然连接要求相等属性值的属性名必须相同,即两关系只有在同名属性才能进行自然连接。
- 等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。
FULLJOIN:
FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果"Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。
关于连接例子下面文章很好!!!
http://www.cnblogs.com/huangfr/archive/2012/06/20/2555530.html
MySQL中的行级锁,表级锁,页级锁
http://www.hollischuang.com/archives/914
详细参考:http://www.jianshu.com/p/000dfd9bc3cf
应用场景:库存管理:(每天只发生100笔业务需要写入,但是每天不同的售货员,需要查询数千遍库存数据)
内容质量极高的个人blog网站:每天会编辑并发表一篇博客。由于内容质量比较好,所以每篇博客都有很高的阅读量(100000(R):1(W))
基本的原理:基本原理是让master数据库处理写操作,slave数据库处理读操作。master将写操作的变更同步到各个slave节点。
为什么可以提高性能?
1.物理服务器增加,机器处理能力提升
2.主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
3.从库可配置myisam引擎,提升查询性能以及节约系统开销
4.从库同步主库的数据和主库直接写还是有区别的,通过主库发送来的binlog恢复数据,但是,最重要区别在于主库向从库发送binlog是异步的,从库恢复数据也是异步的
从服务器通过二进制日志的形式从主服务器同步数据(比通过SQL语句要快的多),所有的从服务器的数据都是完整的数据(相比主服务器会有一定的延迟)。查询时通过各种办法将查询语句分发给不同的从服务器,这样在进行一些比较慢的查询时(多表连接等),多台服务器自然能提供数倍的查询性能。
Rank排序例子
本题的主要思想是复用salaries表进行比较排名,具体思路如下:
1、从两张相同的salaries表(分别为s1与s2)进行对比分析,先将两表限定条件设为to_date = '9999-01-01',挑选出当前所有员工的薪水情况。
2、本题的精髓在于s1.salary <= s2.salary,意思是在输出s1.salary的情况下,有多少个s2.salary大于等于s1.salary,比如当s1.salary=94409时,有3个s2.salary(分别为94692,94409,94409)大于等于它,但由于94409重复,利用COUNT(DISTINCTs2.salary)去重可得工资为94409的rank等于2。其余排名以此类推。
3、千万不要忘了GROUP BY s1.emp_no,否则输出的记录只有一条(可能是第一条或者最后一条,根据不同的数据库而定),因为用了合计函数COUNT()
4、最后先以 s1.salary 逆序排列,再以s1.emp_no 顺序排列输出结果
SELECT s1.emp_no, s1.salary, COUNT(DISTINCT s2.salary) AS rank
FROM salaries AS s1, salaries AS s2
WHERE s1.to_date = '9999-01-01' AND s2.to_date = '9999-01-01' AND s1.salary <= s2.salary
GROUP BY s1.emp_no
ORDER BY s1.salary DESC, s1.emp_no ASC
批量插入1000万条数据到mysql数据库表
主要思路是分批插入,每一批一次性插入多条(在一个事务里)。
http://www.cnblogs.com/fanwencong/p/5765136.html