1.存储引擎认识及相关知识
1.1存储引擎概念:
官方定义:将数据以不同的技术存储在文件(内存)中,该技术即为存储引擎,也称为表类型。每种存储引擎使用不同的存储机制、索引技巧及锁定水平。简单讲,存储引擎是存储数据,查询数据的技术。
1.2相关知识
.并发:之前的认识一直比较片面:并发即是同时有很多对象进行相同/类似操作,此时观察系统的反应:响应时间,资源分配,还有一层含义:
多个对象对同一数据进行修改操作。
.并发控制:多个连接(对象)对数据进行修改操作,保证数据的一致性和完整性的技术。用的技术是锁:分共享锁(读锁),排他锁(写锁)。
.共享锁和排他锁:共享锁,允许同一时间可以多个连接读取资源;
排他锁,在对某一数据进行写 操作时,会禁止其他连接进行操作,有排他性。锁也会消耗资源,所以,用排他锁时,要锁最小的,不是最大的,比如:对某条记录进行修改,只锁定该条记录,而不是锁整张表。
.锁策略:表级锁:一张表就一个锁,所以是最小开销锁;
行级锁:表中记录很多,一行一个锁,会有很多,所以,是最大开销锁。
.事务:目的是保证数据的完整性。
特性: 1.原子性(Atomicity):处于同一事务中的多条语句不可分割;
2.一致性(Consistency):必须使DB从一个一致性状态变换到另外一个一致性状态;
3.隔离型(Isolation):多线程环境下,一个线程中的事务不能被其他线程中事务打扰;
4.持久性(Durability):事务一旦提交,应该被永久保存。
.脏读、幻读、虚读:
脏读:一个线程中事务读取到另外一个线程中未提交的数据,简单说一个事务修改了记录数据,但还未提交,但此时另一个事务读取了该记录,导致读到脏数据。
幻读:当一个线程修改整张表中所有数据时,此时另一个线程往表中插入了数据,导致第一个线程用户发现处理表中数据还有未修改数据,即是幻读。简单讲,一个事务的更新操作被另一个事务更新操作覆盖,导致数据不一致。
虚读:又称不可重复读,指在一个事务内多次读取同一数据集合,发生了事务读取不一致情况。由于查询时系统中其他事务修改的提交而引起的。比如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行校验而再次读取该数据,便得到了不同结果。
虚读和幻读区别:从结果上看,两者都表现为 两次读取的结果不一致,但从控制角度:虚读,只需要锁住满足条件的记录;幻读,只要锁住满足条件及其相近的记录。
总结:不可重复读侧重于修改;
幻读侧重于新增和删除;
解决不可重复读问题只需要锁住满足条件的行,解决幻读需要锁表。
索引:对数据表中一列或多列的值进行排序的一种结构。可以快速访问数据表中特定信息。通常比喻成书中目录。
外键:保证数据一致性的策略。
2.存储引擎分类
MyISAM
InnnoDB
Memory
CSV
Archive
3.存储引擎特点:
4.存储引擎锁的介绍
4.1InnoDB的锁
默认采用行锁,自动加锁,无需人工干预:对UDI(UPDATE,DELETE,INSERT)会自动给涉及数据及加排他锁,对普通SELECT,不加任何锁。
在未使用索引字段查询时升级为表锁,但行锁加锁慢,开销大,容易出现死锁,其优点是锁力度小,发生锁冲突的概率低,处理并发能力强。
语法:
共享锁:select * from tableName where ... +lock in share more
排他锁:select * from tableName where ...+for update
4.2MyISAM锁
MyISAM不容易出现死锁,因为不支持事务,相当于每一条SQL就是一个事务,可以一次获得SQL语句所需要的全部锁,当某个会话执行完一条语句之后会立马把锁给释放,并不会把锁保留。
只支持表锁,可以通过table_locks_waited和table_locks_immediate状态变量分析系统上的表锁争用情况:
table_locks_waited值比较高,说明存在比较严重的表级锁争用情况。
表级锁模式:表共享读锁(Table Read Lock),表独占写锁(Table Write Lock)。锁模式兼容性如下:
从上图可知,MyISAM的表读操作 ,不会注释其他用户对同一表的读请求,但会阻塞对同一表的写请求;MyISAM表的写操作,会阻塞其他用户对同一表的读和写操作。
其中,读操作与写操作之间,及写操作之间都是串行的:当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作,其他线程的读、写操作都会等待,直到锁被释放,所以表级锁的并发处理性能比较差。
加表锁语法:
说明:以下命令是显示加锁,lock table命令不能访问未加锁的表。
lock table tableName read;
lock table tableName write;
释放锁语法:
unlock tables;
4.3InnoDB和MyISAM的区别:
1.InnoDB支持事务(transaction);
2.默认采用行级锁,而MyISAM只支持表锁。