事务、存储引擎、索引、锁
事务
1、概念
逻辑上的一组操作,组成这组操作的每条sql语句,要么同时成功,要么同时失败,就可以使用事务将这多条sql语句捆绑起来。
比如:转账
张三 1000 - 500 = 500
李四 1000 + 500 = 1500
2、使用
使用步骤:
(1)在执行绑定的sql语句之前,开启事务
(2)执行出了故障,就回滚事务
(3)如果执行成功,就提交事务
--开启事务
start transaction;
--回滚事务
rollback;
--提交事务
commit;
3、提交
查询事务提交方式:
SELECT @@AUTOCOMMIT; – 1代表自动提交 0代表手动提交
修改事务提交方式:
SET @@AUTOCOMMIT=数字;
4、特征
1、原子性
事务绑定的多个sql语句不可以分割
2、一致性
一个事务执行之前和执行之后,必须处于一致性的状态
3、隔离性
一个事务在执行操作的时候,不会被其它事务所干扰
4、持久性
事务一旦提交,数据就会被持久化到本地
5、隔离级别
1、级别:
read uncommitted 读未提交
read committed 读已提交
repeatable read 可重复读
serializable 串行化
2、如果不考虑隔离级别会产生的问题
(1)脏读
一个事务处理过程中,读取到了另外一个事务未提交的数据,导致两次查询结果不一致。
产生的原因:隔离级别是read uncommitted
解决方案:隔离级别改为 read committed
(2)不可重复读
一个事务处理过程中,读取到了另外一个事务已提交的数据,导致两次查询结果不一致。
产生的原因:隔离级别是read committed
解决方案:隔离级别改为repeatable read
(3)幻读
查询数据不存在,准备插入数据的时候发现已经存在,删除也是这样
产生的原因:隔离级别是repeatable read
解决方案:隔离级别改为serializable
存储引擎
1、概念
数据库引擎,相当于java中的jvm,主要是搭建数据库的运行环境,并且实现和底层操作系统文件进行数据交互。
操作数据库必须有连接,然后需要校验sql语法,然后解析sql语句,明确操作和列数据的需求,如果是查询还需要进行查询语句的优化以及缓存数据的判断,这些都是在数据库引擎的基础上完成。最后将数据库数据的操作对应到系统的文件中。
分类:
(1)myISAM:有着较高的插入和查询技术,但是不支持事务和外键操作
(2)InnoDB:mysql5.5之后默认的数据库技术,支持事务和外键操作,支持行级锁定
(3)memory:内存存储,速度快,不安全,适合小量快速访问的数据
2、使用
1、查询数据库支持的存储引擎
SHOW ENGINES;
2、创建数据表指定存储引擎
CREATE TABLE 表名(
列名,数据类型,
…
)ENGINE = 引擎名称;
3、修改数据表的存储引擎
ALTER TABLE 表名 ENGINE = 引擎名称;
3、选择
1、如果存在并发的增删改操作,选择InnoDB引擎,支持事务,能够做到并发安全。
2、如果只是单纯的查询操作,选择MyISAM引擎
(1)不支持事务,不需要向InnoDB那样,基于MVCC的判断而带来的效率开销
(2)索引机制不太一样,MyISAM直接指向数据的;InnoDB索引不一定指向数据的,聚簇索引是直接指向数据的,二级索引不直接指向数据,需要数据得通过聚簇索引查询,这个过程我们称之为回表。
3、总结:针对不同的需求场景,来选择最适合的存储引擎即可!如果不确定、则使用数据库默认的存储引擎
索引
1、概念
索引是数据结构,可以简单理解为排好序的快速查找数据结构。
除了存储数据以外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构 的基础上实现高级查找算法,这种数据结构就是索引。
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
1、按照功能分:
普通索引:最基本的索引
唯一索引:值是唯一的
主键索引:随着主键的创建而创建
联合索引:多列组成的索引
外键索引:随着外键的创建而创建
全文索引:快速的匹配全部文档的方式
2、按结构分类:
BTree索引:InnoDB和MyISAM存储引擎默认的索引类型,底层是基于B+tree数据结构
Hash索引:MEMORY存储引擎默认的索引类型
2、分类
在InnoDB中,索引分两大类:
1、聚簇索引
将数据存储与索引放到了一块,找到索引也就找到了数据,聚簇索引对应的B+Tree数据结构中的叶子节点是包含整行记录的
在InnoDB中是必须存在,一般是基于主键构建,如果表中没有主键,到表中找一个唯一约束的列构建,如果既没有主键,又没有唯一约束的列,会基于隐藏的db_row_id这一列构建。
2、非聚簇索引(二级索引)
将数据与索引分开存储,B+Tree的叶子节点只有索引列和聚簇索引列的值,需要查询更多的数据,需要通过得到的聚簇索引列到聚簇索引对应的B+Tree上获取,这个过程称之为回表操作.
普通索引,唯一索引,联合索引,外键索引,全文索引都是非聚簇索引
(1)InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id =14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。
(2)若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。(重点在于通过其他键需要建立辅助索引)
3、使用
1、增
create index 索引名称;
2、删
DROP INDEX 索引名称 ON 表名;
3、改
ALTER TABLE 表名 ADD INDEX 索引名称(列名);
4、查
show index from 表名;
4、原理
1、磁盘存储
特点
以磁盘块为基本单位
位于同一个磁盘块中的数据会被一次性读取出来
2、BTree
特点
每个节点中不仅包含key值,还有数据,会增加查询数据时磁盘的IO次数
3、B+Tree
特点
非叶子节点只存储key值,所有的数据都存在叶子节点,会减少查询数据时磁盘的IO次数
4、索引是一种数据结构,底层数据结构是B+Tree。为什么是B+Tree而不是BTree??
(1)数据库在查询数据时,以页的方式将磁盘数据加载到数据建库内存,默认每页数据大小是16kb,为了提升查询效率,需要减少页的加载次数(io操作)。
(2)BTree数据结构,每个节点中直接保存数据,这样的话16kb的页包含的节点数量就会比较少,所以在查询时,需要加载更多的页。
(3)B+Tree数据结构,只有叶子节点包含数据,其他非叶子节点只包含索引列的值,16kb的页能包含的节点数量就大增,相对于BTree而言,能够更少的加载页。
5、设计原则
1、一张表的索引数量不超过5个,在实际开发中,要不停去维护和取舍
2、最左匹配原则
3、索引列的值要尽可能简短
如果索引列的值越小,那么在构建索引数的时候,非叶子节点的大小就会越小,16kb一页就能包含更多的非叶子节点
优点:
所有的mysql字段都可以作为索引
索引可以加快查询速度
原则;
对于经常用于查询的字段应该建立索引
数据量比较小的表最好不要使用索引,否则起不了优化作用
锁
1、概念
数据库为了让共享的数据在并发访问的时候变得安全而设计的一种规则
2、共享和排他锁
1、共享锁:
可以被多个事务查询,但是不能修改
2、排他锁
加锁的数据,不能被其他事务加锁查询和修改
3、MyISM读写锁
1、读锁
只能查询数据,不能修改数据
2、写锁
当前的连接可以增删改查,其他连接不能增删改查
4、悲观和乐观锁
1、悲观锁
就是很悲观,它对于数据被外界修改的操作持保守态度,认为数据随时会修改。整个数据处理中需要将数据加锁。悲观锁一般都是依靠关系型数据库提供的锁机制。
2、乐观锁
就是很乐观,每次自己操作数据的时候认为没有人会来修改它,所以不去加锁。但是在更新的时候会去判断在此期间数据有没有被修改。需要用户自己去实现,不会发生并发抢占资源,只有在提交操作的时候检查是否违反数据完整