开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
根据存储方式的不同,MySQL 中常用的索引在物理上分为 B-树索引和 HASH 索引两类,两种不同类型的索引各有其不同的适用范围。
它使用B-Tree数据结构来存储数据,实际上很多存储引擎使用的是B+Tree。B+Tree和B-Tree的不同点在于:
非叶子节点只存储键值信息所有叶子节点之间都有链指针数据记录都存放在叶子节点中B-Tree是为磁盘等外存储设备设计的一种平衡多路查找树。B-Tree模型(InnoDB):
B+Tree模型(InnoDB):
B-树索引的特点:
所有键值分布在整个树中任何关键字出现且只出现在一个节点中搜索有可能在非叶子节点结束在关键字全集内做一次查找,性能逼近二分查找算法B+树索引与B-树索引的不同在于:
非叶子节点只存储键值信息。所有叶子节点之间都有一个链指针。数据记录都存放在叶子节点中。B+Tree对比BTree的优点:
磁盘读写代价更低那么提升查找速度的关键就在于尽可能少的磁盘I/O,那么可以知道,每个节点中的key个数越多,那么树的高度越小,需要I/O的次数越少,因此一般来说B+Tree比BTree更快,因为B+Tree的非叶节点中不存储data,就可以存储更多的key。
查询速度更稳定由于B+Tree非叶子节点不存储数据(data),因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的。
根据索引的具体用途,MySQL 中的索引在逻辑上分为以下 5 类:
【示例】
3)实际使用区分1、单列索引单列索引就是索引只包含原表的一个列。在表中的单个字段上创建索引,单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。示例CREATE INDEX index_addr ON tb_student(address(4));
示例
CREATE INDEX index_na ON tb_student(name,address);
原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个 SQL 语句执行失败,已经执行成功的 SQL 语句也必须撤销,数据库状态应该退回到执行事务前的状态。
2)一致性(consistency)
一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
一个事务的影响在该事务提交前对其他事务都不可见——这通过锁来实现。
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容,脏读,不可重复读)
一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。
主从同步过程中主服务器有一个工作线程I/O dump thread,从服务器有两个工作线程I/O thread和SQL thread。
异步复制是MySQL默认方式,主库写入binlog日志后即可成功返回客户端,无须等待binlog日志传递给从库的过程,但是一旦主库宕机,就有可能出现丢失数据的情况。
热备份:热备份指的是当数据库进行备份时, 数据库的读写操作均不受影响
温备份:温备份指的是当数据库进行备份时, 数据库的读操作可以执行, 但是不能执行写操作
针对不同的场景下, 我们应该制定不同的备份策略对数据库进行备份, 一般情况下, 备份策略一般为以下几种:
直接cp,tar复制数据库文件(物理备份,冷备):适合数据量小。lvm2快照+复制BIN LOGS(逻辑备份,热备):适合数据量一般,使用lvm2的快照对数据文件进行备份, 而后定期备份BINARY LOG达到增量备份的效果。mysqldump+复制BIN LOGS(逻辑备份,热备):适合数据量中等,先使用mysqldump对数据库进行完全备份, 然后定期备份BINARY LOG达到增量备份的效果。xtrabackup(逻辑备份,热备):适合数据量很大,使用xtrabackup进行完全备份后, 定期使用xtrabackup进行增量备份或差异备份。所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB。
产生死锁的四个必要条件:
互斥条件:一个资源每次只能被一个进程使用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
【原因】
死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。
【解决】
那么对应的解决死锁问题的关键就是:让不同的session加锁有次序。
最大限度的降低死锁方法:
按同一顺序访问对象。避免事务中的用户交互。保持事务简短并在一个批处理中。使用低隔离级别。使用绑定连接。