database
MYSQL默认隔离级别为:可重复读 (Repeated read)
1、innoDB(B+树)支持事务,适合修改多场景
非叶子节点只存键,叶子结点包含全部数据
2、MyIASM不支持事务,适合查询多场景,写操作锁整个表
Oracle默认隔离级别为:读已提交(READ COMMITTED)
1、select /*parallel*/ * from table 开启多核计算查询
redis
1、String、hash、list、set、zset
2、主要用到string、hash;list队列、set、zset求交并差集
3、持久化RDB性能高、AOF频率高,优先AOF
缓存
1、缓存雪崩,短时间内大量缓存失效,对数据库造成巨大压力,使系统奔溃
设置不同的缓存失效时间
2、缓存穿透,数据库没有符合条件的数据,不进行缓存,多次查询数据库
空值缓存,短过期时间
3、缓存预热
4、缓存击穿,缓存没有,数据库有,大并发同时查询数据库
加锁互斥
SQL优化
1、用到索引
2、减少不必要排序
3、减少不必要字段查询
4、小表在前
5、过滤大的条件尽可能在前
6、组合索引效率高于单个索引
7、msql用到索引覆盖效率会高很多
索引
1、排序、分组、连表查询的字段、常作为查询条件的字段
2、尽量选择区分度高的字段,索引的字段不能过长(可选择前缀作为索引)
3、索引列不能参与计算
4、避免创建不必要过多的索引,会增加维护成本
普通索引 最基本的索引,没有任何限制
唯一索引 与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引 它是一种特殊的唯一索引,不允许有空值。
全文索引 针对较大的数据,生成全文索引很耗时好空间。
组合索引 为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则
5、or的每个字段都要有索引,模糊只能后模糊,索引字段不能使用函数和计算,is not null不会走索引
数据库三范式
1、每列数据的原子性,不可拆分
2、非主键列只能依赖主键,描述每张表做一件事
3、不存在对非主键列的传递依赖
事务ACID
1、原子性
2、一致性
3、隔离性
4、永久性
5、分布式多库事务,分阶段提交
6、柔性事务(分布式的分阶段提交、补偿型在分阶段上保证高效,异步确保型消息中间件解耦,异步确保上多次重试型)
事务的四种隔离级别
1、读未提交,脏读读其它事务未提交的数据
2、读已提交,不可重复读一次事务多次读取其它事务提交的数据不一致
3、可重复度,幻读一次事务中多次读取,其它事务进行增加删除导致的结果集不一致
4、串行化
CAP
1、一致性、所有节点访问同一份最新的数据副本
2、可用性、对数据更新具备高可用性
3、分区容错性、能在时限内达成数据一致性
存储过程(特定功能的 SQL 语句集)
1、一次编译多次调用的SQL语句集
2、少使用游标性能不高,事务越短越好,中间结果存放临时表加索引
触发器(一段能自动执行的程序)
1、表发生新增、修改、删除操作时触发的特殊存储过程
数据库并发
1、乐观锁、悲观锁、时间戳
2、乐观锁,认为读的时候不会写
3、悲观锁,写的时候不允许读(写锁,排它锁;读锁,共享锁)
4、时间戳(版本号),表中加一列时间戳,每次读出来回血+1,写的时候和原来值比较
5、行级锁,是一种排它锁
6、表级锁,有共享锁和排它锁
7、页级锁,介于行级和表级中间,锁定一组相近的数据
分区分表
1、分库分表,垂直切分,不同业务表分在不同数据库
2、分库分表,水平切分,根据某个字段值,按照规则将大表拆分为多个小表
3、分区,按照分区规则,数据库在物理上多张表逻辑上一张表,索引等都由数据库维护