sql语句分析|事务如何执行

首先要说到的是mysql中的两种日志
redo log:事务执行时写的日志,通常是物理日志,写在内存中
undo log:事务回滚后写的日志,一般是逻辑日志

  • explain sql分析sql中的每列值含义解析

  1. select_type:SIMPLE|PRIMARY/UNION | DEPENDENT UNION/UNIOIN RESULT | SUBQUERY/DEPENDENT SUBQUERY
    1.1.仅列出常见的3种
    1) SIMPLE:简单的SELECT语句(不包括UNION操作或子查询操作)。
    2)PRIMARY:查询中最外层的SELECT(如两表做UNION或者存在子查询的外层的表操作为PRIMARY,内层的操作为UNION)。
    3) UNION:UNION操作中,查询中处于内层的SELECT(内层的SELECT语句与外层的SELECT语句没有依赖关系)。
  2. table:输出行的表使用的table名。
  3. partitions:匹配的分区版本5.7以前,该项是explain partitions显示的选项,5.7以后成为了默认选项。该列显示的为分区表命中的分区情况。非分区表该字段为空(null)。
  4. type:连接类型依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引
  5. possible_keys:查询可能使用到的索引。
  6. key:查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个。
  7. key_len:用于处理查询的索引长度,如果是单列索引,那就整个索引长度算进去,如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去。留意下这个列的值,算一下你的多列索引总长度就知道有没有使用到所有的列了。要注意,mysql的ICP特性使用到的索引不会计入其中。另外,key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。
  8. ref:如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func
  9. rows:这里是执行计划中估算的扫描行数,不是精确值
  10. filterd:按表条件过滤的行的百分比
  11. extra:此列包含有关MySQL如何解析查询的其他信息。
  • 查看及设置事务级别

show @@tx_isolation

  • 1). read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
  • 2). read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的
  • 3). repeatable read:重读读取:可以解决脏读 和 不可重复读 ---mysql默认的
  • 4). serializable:串行化:可以解决 脏读 不可重复读 和 虚读---相当于锁表
    set session transaction isolation level 设置事务隔离级别

参考文档及文章
mysql官方文档-EXPLAIN
https://www.jianshu.com/p/3bb299e47e7d
https://www.cnblogs.com/xiaohongxin/p/6752831.html

你可能感兴趣的:(sql语句分析|事务如何执行)