基础
数据库事务:是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:
- 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
- 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
- 事务的四大特性: ACID
- 原子性 Atomicity: 事务包含的所有数据库操作要么全部成功,要不全部失败回滚
- 一致性 Consistency: 一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
- 隔离性 Isolation: 一个事务未提交的业务结果是否对于其它事务可见。级别一般有:read_uncommit,read_commit,read_repeatable,串行化访问。
- 持久性 Durability: 一个事务一旦被提交了,那么对数据库中数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
- 隔离级别: 由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
- 脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
-
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
1 2
不可重复读和脏读的区别是,脏读是末一事务读取了另一个事务未提交的脏数据, 而不可重复读则是读取了前一事务提交的数据
-
幻读是事务非独立执行时发生的一种现象。例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。
- 三大范式
- 第一范式(确保每列保持原子性)
- 第二范式(确保表中的每列都和主键相关)
- 第三范式(确保每列都和主键列直接相关,而不是间接相关)
索引
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。实现通常使用B树及其变种B+树。
优点:
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
- 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
- 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
- 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
- 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
- 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
主键ID,主键既是约束也是特殊的唯一索引,同时也用于对象缓存的键值
根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。
存储引擎
MySQL默认是InnoDB
视图、触发器、存储过程
视图(view) 是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。
- 视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。
- 可以像操作普通表一样对视图进行SELECT,过滤,等操作。
存储过程 为以后的使用而保存的一条或多条SQL语句的集合,可以将其视为批文件。
触发器 需要在表发生改动时自动处理某个逻辑,其实这就是触发器。
- 触发器只能在表改动时执行,即只作用于delete,update,insert语句.
语法
2PC
2PC即innodb对于事务的两阶段提交机制。当mysql开启binlog的时候,会存在一个内部XA的问题:事务在存储引擎层(redo)commit的顺序和在binlog中提交的顺序不一致的问题。
分布式事务 解决:2PC、TCC、本地消息表、MQ、Saga
查看SQL执行慢
捕获低效SQL语句:
-
slow_query_log 这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句。
-
long_query_time 当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短。
-
slow_query_log_file
记录日志的文件名。 -
log_queries_not_using_indexes 这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快。
检测mysql中sql语句的效率的方法:
- 通过查询日志.
- show processlist 命令, 显示哪些线程正在运行.
- explain来了解SQL执行的状态.