Mysql常用存储引擎
| 存储引擎 | 锁 | 事务 | 外键 | 空间数据 | 性能 | 索引类型 |
| MyISAM | 表级锁 | 不支持 | 不支持 | 支持 | 高 | 非聚集索引 |
| InnoDB | 行锁、页锁、表级锁
|
支持 | 支持 | 不支持 | 低 | 主键为聚集索引,其他为辅助索引 |
事务
事务是逻辑上的⼀组操作,要么都执⾏,要么都不执⾏。
-
事务四大特性
-
原⼦性(Atomicity): 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么完全不起作⽤;
-
⼀致性(Consistency): 执⾏事务前后,数据保持⼀致,多个事务对同⼀个数据读取的结果是相同的;
-
隔离性(Isolation): 并发访问数据库时,⼀个⽤户的事务不被其他事务所⼲扰,各并发事务 之间数据库是独⽴的;
-
持久性(Durability)⼀个事务被提交之后。它对数据库中数据的改变是持久的,即使数据 库发⽣故障也不应该对其有任何影响。
-
-
并发事务带来的问题
- 脏读(Dirty read): 当前事务读到了T1事务未提交的数据,然后T1事务回滚,这个数据就是一个脏数据
- 不可重复读(Unrepeatableread):当前事务第一次查询没有数据,这是T1事务提交了一条数据,当前事务再次查询,却查到了这次数据,在一次事务中读到的数据不一致
- 幻读(Phantom read):幻读和不可重复度类似,它发⽣在⼀个事务(T1)读取了⼏⾏数据,接着另⼀个并发事务(T2)插⼊了⼀些数据时。在随后的查询中,第⼀个事务(T1)就会发现多了⼀些原本不存在的记录,就好像发⽣了幻觉⼀样
- 丢失修改:指在⼀个事务读取⼀个数据时,另外⼀个事务也访问了该数据,那么在第⼀个事务中修改了这个数据后,第⼆个事务也修改了这个数据。这样第⼀个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
-
事务隔离级别
- READ-UNCOMMITTED(读未提交):允许读取未提交的数据,,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读已提交):允许读取已提交数据,可以阻⽌脏读,但是幻读或不可重复读仍有可能发⽣。
- REPEATABLE-READ(可重复读):对同⼀字段的多次读取结果都是⼀致的,除⾮数据是被本身事务⾃⼰所修改,可以阻⽌脏读和不可重复读,但幻读仍有可能发⽣。
- SERIALIZABLE(可串⾏化):完全服从ACID的隔离级别。所有的事务依次逐个执⾏,这样事务之间就完全不可能产⽣⼲扰,也就是说,该级别可以防⽌脏读、不可重复读以及幻读。
MySQL默认隔离级别 REPEATABLE-READ(可重复读)
索引
概念:索引是一种数据结果,帮助提高获取数据的速度
优点:索引能极大的减少存储引擎需要扫描的数据量;索引可以把随机 IO 变成顺序 IO;索引可以帮助我们在进行分组、排序等操作时,避免使用临时表。
- 聚集索引:索引中键值的逻辑顺序决定了表中相应行的物理顺序(索引中的数据物理存放地址和索引的顺序是一致的)
- 非聚集索引:索引的逻辑顺序与磁盘上的物理存储顺序不同
- 辅助索引:索引的逻辑顺序与磁盘上的物理存储顺序不同,里面存储了一个指向行数据的数据索引(查询数据时,先检索辅助索引拿到主键,然后在根据主键在主键索引中获取数据,也叫回表)
-
索引数据结构
- B-树(B树):待补充
- B+树:待补充
- B*树:待补充
执行计划
EXPLAIN 是解释 SQL 语句的执行计划,即显示该 SQL 语句怎么执行的。
explain select * from user_info order by user_name

- id 执行select子句或操作表的顺序
- id相同:执行顺序由上至下
- id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
id相同又不同(两种情况同时存在):id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
- select_type:主要是用于区分普通查询、联合查询、子查询等复杂的查询
SIMPLE:简单的select查询,查询中不包含子查询或者unionPRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primarySUBQUERY:在select 或 where列表中包含了子查询DERIVED:在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在零时表里UNION:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derivedUNION RESULT:从union表获取结果的select- table : 表名称
- partitions: 分区
- type:扫描类型system>const>eq_ref>ref>range>index>ALL 其扫描速度由快到慢
- system:系统表,少量数据,往往不需要进行磁盘IO
- const:命中主键或者唯一索引,常量连接
- eq_ref:命中主键索引或者非空唯一索引,等值扫描
- ref:非主键非唯一索引的索引,等值扫描(可能会有多行数据返回)
- range:索引上的范围查询,它会在索引上扫码特定范围内的值
- index:扫描索引上的全部数据来计数,它仅比全表扫描快一点
- ALL:全表扫描
- possible_keys: 查询过程中有可能用到的索引。
- key:实际使用的索引,如果为 NULL ,则没有使用索引。
- key_len:表示索引使用的字节数,key通过该列计算查询中使用的索引长度
- ref: type访问类型的具体指
- rows:根据表统计信息或者索引选用情况,大致估算出找到所需的记录所需要读取的行数。
- filtered :表示返回结果的行数占需读取行数的百分比, filtered 的值越大越好。
- Extra :额外信息
- Using filesort:MySQL 对数据使用一个外部的文件内容进行了排序,而不是按照表内的索引进行排序读取。
- Using temporary:使用临时表保存中间结果,也就是说 MySQL 在对查询结果排序时使用了临时表,常见于order by 或 group by。
- Using index:表示 SQL 操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高。
- Using index condition:表示 SQL 操作命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。
- Using where:表示 SQL 操作使用了 where 过滤条件。
- Select tables optimized away:基于索引优化 MIN/MAX 操作或者 MyISAM 存储引擎优化 COUNT(*) 操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即可完成优化。
- Using join buffer (Block Nested Loop):表示 SQL 操作使用了关联查询或者子查询,且需要进行嵌套循环计算。
欢迎大家进行补充和说明
整理自:https://www.cnblogs.com/yinjw/p/11864477.html
https://www.jianshu.com/p/514aa0b139d8
来源:oschina
链接:https://my.oschina.net/u/4398470/blog/4498777