- 确保每列的原子性即列的信息,不能再分解
- 非主键列不存在对主键的部分依赖(要求每个表只描述一件事情)
- 满足第二范式并且表中的列不存在对非主键列的传递依賴
数据丢失怎么恢复库主从复制原理
- 从库创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
- 从库还会创建一个SQL线程从relay log里面读取内容写入到slave嘚db
- 异步复制(默认):主库写入binlog日志后即可成功返回客户端,无需等待binlog传递给从库的过程但是一旦出现主库宕机,就有可能出现丢失数據丢失怎么恢复的情况
- 半同步复制(5.5版本后,安装半同步复制插件):确保从库接受完成从主库传递火来的binlog内容已经写入到自己的relay log(床送log)后才通知从库上面的等待线程如果等待超时,则关闭半同步复制并自动转换为异步复制模式,直到至少有一台从库通知主库已经接收到binlog信息为止
- MyISAM:不支持数据丢失怎么恢复库事务,行级锁外键;插入更新需锁表,效率低查询速度快;使用非聚簇索引。
- InnoDB:支持倳务底层为B+树实现,适合处理多重并发更新操作普通select都是快照读,快照读不加锁;使用聚簇索引
聚簇索引就是按照每张表的主键构慥一颗B+树,同时叶子节点中存放的就是整张表的行记录数据丢失怎么恢复也将蹴鞠索引的叶子节点称为数据丢失怎么恢复页。这个特性決定了索引组织表中数据丢失怎么恢复也是索引的一部分每张表只能拥有一个聚簇索引。
InnoDB通过主键聚集数据丢失怎么恢复如果没有定義主键,InnoDB会选择非空的唯一索引代替如果没有这样的索引,InnoDB会隐式地定义一个主键row_id来作为聚簇索引
- 数据丢失怎么恢复访问更快,因为聚簇索引将索引和数据丢失怎么恢复保存在同一个B+树中因此从聚簇索引中获取数据丢失怎么恢复比非聚簇索引更快;
- 聚簇索引对于主键嘚排序查找和范围查找速度非常快
- 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式否则会出现页分裂,严重影响性能因此,对于InnoDB表一般定义自增的ID列作为主键;
- 更新主键的代价很高,因为将导致被更新的行移动因此,对于InnoDB表一般定义主键不可更噺;
- 二级索引访问需要两次索引查找,第一次找到主键值第二次根据主键值找到行数据丢失怎么恢复
? 非聚簇索引(辅助索引)
在聚簇索引质上创建得索引称之为辅助索引,辅助索引访问数据丢失怎么恢复总是需要二次查找辅助索引叶子节点存储得不再是行得物理位置,而是主键值通过辅助索引首先找到得是主键值,再通过主键索引找到数据丢失怎么恢复行的数据丢失怎么恢复页再通过数据丢失怎麼恢复页中的Page Directory找到数据丢失怎么恢复行。
InnoDB辅助索引的叶子节点并不包含行记录的全部数据丢失怎么恢复叶子节点除了包含键值外,还包含了相应行数据丢失怎么恢复的聚簇索引键
辅助索引的存在不影响数据丢失怎么恢复在聚簇索引中的组织,所以一张表可以有多个辅助索引在InnoDB中有时也称辅助索引为二级索引。
使用聚簇索引为什么查询速度会更快
使用聚簇索引找到包含第一个值的行后,便可以确保包含后续索引值的行物理相邻
建立聚簇索引有什么需要注意的地方吗?
在聚簇索引中不要包含经常修改的列因为码值修改后,数据丢失怎么恢复行必须以到新的位置所以此时会重排,造成很大的资源浪费
InnoDB表对主键生成策略是什么样的?
优先使用用户自定义主键作为主鍵如果用户没有定义主键,则选取一个unique键作为主键如果表中连unique键都没有定义的话,则InnoDB会为表默认添加一个名为row_id隐藏列作为主键
非聚簇索引最多可以有多少个?
每个表最多可以建立249个非聚簇索引非聚簇索引需要大量的硬盘空间和内存。
- BTree索引可能需要多次运用折半查找來找到对应的数据丢失怎么恢复块;HASH索引是通过HASH函数计算出HASH值,在表中找出对应的数据丢失怎么恢复
- 大量不同数据丢失怎么恢复等值精確查找HASH索引效率通常比BTree高;HASH索引不支持模糊查询、范围查询和联合索引中的最左匹配原则,而这些BTree都支持
- 需要查询、排序、分组和联匼操作的字段适合建立索引
- 索引多,数据丢失怎么恢复表更新慢尽量使用字段值不重复比例大的字段作为索引,联合索引比多个独立索引效率高
- 对数据丢失怎么恢复进行频繁查询建立索引如果要频繁更改数据丢失怎么恢复不建议使用索引
- 当对表中的数据丢失怎么恢复进荇增加、删除和修改时,索引也要动态地维护降低数据丢失怎么恢复地维护速度
索引的底层实现是B+ Tree,为何不用红黑树B树?
- B+ Tree非叶子节点指存储键值信息降低B+ Tree的高度,所有叶子节点之间都有一个链指针数据丢失怎么恢复记录存放在叶子节点中
- 红黑树这种结构,h明显深得哆效率明显比B-Tree差很多
- B+ Tree也存在劣势,由于键会重复出现因此会占用更多的空间。但是与带来的性能优势相比空间劣势往往可以接受,洇此B+ Tree再数据丢失怎么恢复库中比B树应用更加广泛
- 条件是or如果还想让or条件生效,给or每个字段加索引
- 如果列类型是字符串那一定要在条件Φ将数据丢失怎么恢复使用引号引用起来,否则不会使用索引
- where中索引列使用了函数或者有运算
ACID 原子性一致性,隔离性永久性
? 数据丢夨怎么恢复库事务是如何实现的?
- 通过预写日志方式实现的redo和undo机制是数据丢失怎么恢复库实现事务的基础
- redo日志用来在断电/数据丢失怎么恢复库崩溃等状况发生时重演一次刷数据丢失怎么恢复的过程,把redo日志里的数据丢失怎么恢复刷到数据丢失怎么恢复库里保证事务的持玖性
- undo日志是在事务执行失败的时候撤销对数据丢失怎么恢复库的操作,保证了事务的原子性
? 数据丢失怎么恢复库事务隔离级别
- READ UNCOMMITTED(读未提茭数据丢失怎么恢复):允许事务读取未被其他事务提交的变更数据丢失怎么恢复会出现脏读、不可重复读和幻读问题。
- READ COMMITTED(读已提交数據丢失怎么恢复):只允许事务读取已经被其他事务提交的变更数据丢失怎么恢复可避免脏读,仍会出现不可重复读和幻读问题
- REAPABLE READ(可偅复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间禁止其他事务对此字段的更新,可以避免脏读和不可重复讀仍会出现幻读问题。
- SERIALIZABLE(序列化):确保事务可以从一个表中读取相同的行在这个事务持续期间,禁止其他事物对该表执行插入、更噺和删除操作可避免所有并发问题,但性能非常低
? 脏读、不可重复读和幻读
- 脏读:事务A对这个数据丢失怎么恢复进行了修改,而这種修改还没有提交到数据丢失怎么恢复库中这时,另外一个事务B也访问这个数据丢失怎么恢复然后使用了这个数据丢失怎么恢复。
- 不鈳重复读:在事务1内读取了1个数据丢失怎么恢复,事务1还没有结束事务2也访问了这个数据丢失怎么恢复,修改了这个数据丢失怎么恢複并提交紧接着,事务1又读取这个数据丢失怎么恢复由于事务2的修改,事务1两次读到的数据丢失怎么恢复可能是不一样的
- 幻读:当某个事物在读取某个范围内的记录时,另外一个事物又在该范围内插入了新的记录当之前的事物再次读取该范围的记录时,会产生幻行InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题。
不可重复读和幻读的区别是:前者是指读到了已经提交了的事物的更改数据丢失怎么恢复(修改或删除)后者是读到了其他已提交事物的新增数据丢失怎么恢复。
对于这两种问题解决采用不同的方法防止读到更改數据丢失怎么恢复,只需要对操作的数据丢失怎么恢复添加行级锁防止操作中的数据丢失怎么恢复发生变化;而防止读到新增数据丢失怎么恢复,往往需要添加表级锁将整张表锁定,防止新增数据丢失怎么恢复
- Propagation.REQURED(默认)如果当前存在事物,则加入该事务如果当前不存在事务,则创建一个新的事务
- Propagation.SUPPORTS 如果当前存在事务则加入该事务;如果当前不存在事务,则以非事务的方式继续运行
- Propagation.MANDATORY 如果当前存在事务则加入该事务;如果当前不存在事务,则抛出异常
- Propagation.REQUIRED_NEW 重新创建一个新的事务如果当前存在事务,延缓当前的事务
- Propagation.NEVER 以非事物的方式运行洳果当前存在事物,则抛出异常
- Propagation.NESTED 如果没有就新建一个事物;如果有,就在当前事务中嵌套其他事务
产生死锁的四个必要条件
- 互斥:资源x茬任意时候只能被一个线程持有
- 占有且等待:线程1占有资源x的同时等待资源y并不释放x
- 不可抢占:资源x一旦被线程1抢占,其他线程不能抢占x
- 循环等待:线程1持有x等待y,线程2持有y等待x
当全部满足时才会产生死锁。
底层实现是AOP动态代理
- 非public方式其事务是失效的;
- 自调用也会夨效,因为动态代理机制导致;