Mysql数据库的几个特点
导读:0.存储引擎MyISAM和InnoDB区别 1.事物级别 2.聚集索引和非聚集索引 3.回表 4.explain执行计划
0.存储引擎MyISAM和InnoDB区别
MyISAM
- 不支持事务,所以每次查询都是原子的;
- 支持表级锁,即每次操作是对整个表加锁;
- 存储表的总行数;
- 一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;
- 采用非聚集索引(Non-clustered),索引文件的数据域存储指向数据文件的指针。
InnoDb
- 支持ACID的事务;
- 支持行级锁及外键约束;
- 不存储总行数;
- 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个,受操作系统文件大小的限制;
- 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;
- 使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。
1. 事物的隔离级别
查询隔离级别:SHOW VARIABLES LIKE 'transaction_isolation%';
读未提交 Read uncommitted
解释:一个事务可以读取到其他事务尚未提交的数据,也就是脏数据。
可能出现的问题:脏读
、不可重复读
和幻读
读提交 Read committed
解释:事务A只能读取到已经提交的数据,也就是其他事务B已经提交的数据。当其他事务B正在修改某个数据时,读提交的事务A会被阻塞,直到该数据被事务B提交为止。
解决:脏读
,可能出现的问题:不可重复读
和幻读
Sql Server,Oracle的默认隔离级别是Read committed
。
可重复读 Repeatable read
解释:是指在一个事务A中多次读取同一数据时,每次读取的结果都是一样的。这是因为在可重复读的隔离级别下,一个事务A读取的数据会被锁定,直到事务A提交或回滚,其他事务B才会对其进行修改。
解决:脏读
和不可重复读
,可能出现的问题:幻读
MySQL的默认隔离级别就是Repeatable read
。
串行化 serializable
解释:所有事务都必须按照串行的方式执行,也就是说,每个事务必须等待前一个事务完成后才能执行。
解决:脏读
、不可重复读
和幻读
可能出现的问题
脏读
事务可以读取到其他事务尚未提交的数据,也就是脏数据
不可重复读
在一个事务中,同一个查询语句执行两次或多次,但是返回的结果不同。这是由于在事务执行期间,另一个事务修改了查询结果中的某些数据(指update已存在的数据)
。
幻读
在一个事务中,同一个查询语句执行两次或多次,但是返回的结果不同。这是由于在事务执行期间,另一个事务插入或删除了查询结果中的某些数据。(指insert新的数据或delete数据)
2.聚集索引和非聚集索引
聚集索引
- 一个表只能有一个
- 存储记录是物理上连续存在
- 叶子节点就是数据节点,存储的数据本身
非聚集索引
- 一个表存在多个:普通索引,唯一索引,全文索引
- 存储记录是逻辑上的连续,物理存储并不连续
- 叶子节点是数据的聚集索引的key,一个指针指向对应的数据块
3.回表
通过非聚集索引查找的过程是先找到该索引key对应的聚集索引的key,然后再拿聚集索引的key到主键索引树上查找对应的数据