核心:索引;事务;多表查询;大数据的查询 未完成:索引强化。
- MyISAM:不支持外界约束;不支持事务;锁粒度是表级;支持全文类型索引;(效率高,因为数据保存为文件,跨平台性强)
- InnoDB:支持外键约束;支持事务;锁粒度是行级;不支持全文类型索引;
- 使用场景:MyISAM管理非事务表,速度快,能全文检索故适用大量SELECT查询的情况;InnoDB支持事务性处理,适用于大量增改操作和并发情况。
- 表:create|drop|alter table
- 数据:select|insert|update|delete
- 数据类型:
- 日期时间:date|time|datetime|timestamp|year
- 数值类型:tinyint|smallint|mediumint|int|bigint|float|double|decimal
- 字符串类型:char|varchar(可变长度)|超过255字节:blob(区分大小写)|text(不区分)
select foo,count(foo)from pokes where foo>10 group by foo having count(*)>5 order by foo
执行顺序:FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY
关系型数据库通过约束机制来保证数据的完整性:
- 实体完整性:主键约束|唯一约束;这两个约束均会在数据库中创建对应的索引
- 域完整性:默认约束|空值约束|检查约束(InnoDB不支持)
- 参照完整性:外键约束;也会创建索引
- TRUNCATE:通过释放存储表数据所用的数据页来删除数据,日志只记录页的释放。
- DELETE是每次删除一行,并在事务日志中为所删除的每行记录一项。
补充:
- TRUNCATE TABLE:删除内容、释放空间但不删除定义。
- DELETE TABLE:删除内容不删除定义,不释放空间。
- DROP TABLE:删除内容和定义,释放空间。 速度:DROP>TRUNCATE>DELETE
- 索引种类:单列索引和组合索引|聚集索引和非聚集索引
- 对性能的影响:大大提高MySQL的检索速度,但却降低了更新表的速度,还会占用磁盘空间
- 使用场景:查询比较多,修改比较少;表数量比较大;
- 具体实现:因为使用二叉树导致深度过大,故造成IO读写过于频繁,影响效率,故采用多叉树:通过B树和B+树实现索引
参考那篇文章
- MySQL中InnoDB是聚集索引,MyISAM是非聚集索引。
- 聚集索引和非聚集索引的区别在于表数据行的物理存储顺序与索引的键值逻辑顺序是否一致。 参考
复合索引:idx_A_B_C,只有查询到a,ab,abc,ac是才能用到
- 子查询:可以在主查询的select,from,where和having后面增加子查询,不可以在group by后面放:
- 例如:select empno,ename,sal,(select job from emp where empno=7839) from emp;
- 子查询可以是同一张表,也可以不是同一张表
- 多表查询:
- 内连接(JOIN):只列出这些连接表中与连接条件相匹配的数据行
- 外链接(左外链接(LEFT JOIN),右外链接(RIGHT JOIN))
- 左外连接:左表列出全部,右表只列出匹配的记录
- 交叉连接(CROSS JOIN):返回的是连接表中所有数据行的笛卡尔积
- 第一范式(1NF):强调列的原子性(不可再分)
- 第二范式(2NF):满足1NF,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分(对于联合主键)。
- 第三范式(3NF):满足2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。
- 巴斯-科特范式(BCNF):任何非主属性不能对主键的自己依赖(在3NF范式基础上消除对主码子集的依赖)
- 第四范式(4NF):要求同一表内的多对多关系删除
- 第五范式(5NF):从最终结构重新建立原始结构
- 悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据完整性的操作,即一开始就上锁。
- 乐观锁:假设不会发生并发冲突,只有提交操作时检查是否违反数据完整性。
- 可以使用版本号等机制,即在后面增加版本号,提交版本必须大于记录当前版本才能执行更新
- 关系型数据库写入操作一般基于悲观锁;Redis事务基于乐观锁。
ACID:
- A:Atomicity(原子性):事务的所用操作必须全部执行或者全不执行
- C:Consistency(一致性):事务操作前后的数据必须一致
- I:Isolation(隔离性):多事务并发操作,每个事务必须与其他事务隔离
- D:Durability(持久性):事务操作完毕对数据库影响必须是持久的
CAP:
- C:Consistency(强一致性)
- A:Availability(可用性)
- P:Partition tolerance(分区容错性)
BASE就是为了解决关系数据库中强一致性引起的问题而引起的:
- 基本可用(Basically Available)
- 软状态(Soft state)
- 最终一致(Eventually consistent)
- 数据优化的步骤:
- 使用缓存+垂直拆分
- 主从读写分离
- 分表分库(通过自然时间,hash算法)+水平拆分+mysql集群
参考 参考2 SELECT * FROM table LIMIT [offset,]rows
- 问题:这时候如果limit后面的offset(分页偏移量)时,需要查询offset+rows数量的值,而只显示rows数量的值
- 一种方法:先通过where和order by将结果排出来,再用limit
- select id, name, address, phone FROM customers WHERE id > 990 ORDER BY id LIMIT 1000;
- Redis是内存型非关系型数据库,他的key与5种不同类型的value之间进行映射;
- 五种类型包括:String|Hash|list|set|sorted set
- 同时其还可以使用AOF和RDB将内存的数据持久化到硬盘中去。
- RDB:fork一个子进程,通过子进程将数据写入到临时文件中,等持久化结束后用这个临时文件替换原来的问题;适用于大规模数据恢复,但是可能导致数据丢失。
- AOF:以日志形式记录写操作,只许追加文件但不可以写文件。
- Memcached和redis的区别?
- redis支持的数据类型多,Memcached只支持k/v
- redis支持备份和数据持久化
- 类似与事务,首先通过MULTI标记事务开始,EXEC是执行,DISCARD是取消,通过引入一个乐观锁WATCH,只有当数据改变的时候,才需要UNWATCH
mongoDB存储JSON格式,可以对任何属性建立索引。
- 表叫collection,行叫document,列叫field
- CRUD
- find({"key":"value",...})|find().count()|find("key":{$gt:"10"})
- 正则查询find({"key":{$regex:"value",$option:"$i"}})
- remove()
- insert()
- update({"key":"value",{$set:{"key":"value"}},{multi:true})
- redis 跳表(skiplist)