mysql总结

一、ACID+四种隔离级别

  1)ACID的意义

  A,Atomicity原子性,指一个事务是不可分割的单位,这个事务要么全部成功,要么全部失败。

  C,Consistency一致性,事务执行前后数据的状态不变

  I,Isolation隔离性,事务内部的操作与其他事务是隔离的,事务之间不会有任何干扰

  D,Durability持久性,事务一旦提交,他的改变是永久的

   2)mysql底层是如何保证ACID的

  第一:A原子性

    利用Innodb的回滚日志(undo log),记录下你要回滚的相应sql日志信息;

    当事务要回滚的时候,可以利用undo log中的信息回滚到修改之前的状态,比如你delete一条数据,回滚的时候就会update这条数据

  第二:I隔离性

    利用锁和MVCC机制,即多版本并发控制(Multi Version Concurrency Control)

    简单来说,一行数据有多个版本的快照,这些快照都存在undo log中。如果一个事务正则update或者delete操作,读取操作不会等行上锁释放,而是读取该行的快照版本。相反,是需要加锁的。

    整个隔离操作有点“读写复制”的意思了。

    关注MVCC机制,具体可参考这篇文章:

        https://blog.csdn.net/w2064004678/article/details/83012387

  第三:D持久性

    利用Innodb的重做日志(redo log)

    具体来说,当修改数据的时候,一部分在内存操作,一部分在redo log中操作。当事务提交的时候,会将redo log进行刷盘。当数据库宕机重启,会将redo log内容恢复到数据库中,在更加undo log或者是bin log决定是修改数据还是提交数据。

  第四:C一致性

    一致性是依靠原子性、隔离性、持久性来保证的

  3)四种隔离级别与产生的问题

 

二、mysql语句执行顺序

查询语句:  

  select *

  from table1

  [left/right] join table

  on condtion1

  where condition2

  group by row1

  having condition3

  order by row2

  limit

执行的顺序:
  from => join => on => where =>group by => having => order by => limit 

三、存储引擎的区别

MyISAM   

  1.不支持外键、事务(ACID),但是操作还是原子性的
  2.支持的是表锁(读锁和写锁):
    1)读锁不阻塞读阻塞写,写锁读和写都阻塞
    2)写锁的优先级大于读锁,有一种现象就是读锁先到等待队列,写锁后到,写锁也会插入到读锁之前。这样读可能有饿死现象

  3.缓存了表的行数,select count(*) from table只需要简单的读取行数就行 
  4.MyISAM表的结构:data/table.frm|table.myd|table.myi
    1)一张MyISAM表由表结构文件(.frm)、数据文件(.myd)、索引文件组成(.myi),存在data文件下面
    2)MyISAM索引和数据是分离的(非聚集),所以查询的过程是.myi====>.myd,这也是一个回表的过程

Innodb

  1.支持事务、外键
  2.支持行锁,因此可以支持写的并发
  3.不存储总行数,select count(*) from table 要扫描一遍表来计算行
  4.Innodb表结构:
    一句话总结:索引和数据在一起,而且必须要有主键
      1)表数据文件本身就是一个按照B+Tree组织成的一个索引文件,其中叶子节点包含了完整的数据记录
      2)Innodb存储是必须有主键的,没有主键后台选用一个不重复的字段选为主键

四、索引

五、主从复制

六、sql调优

原文地址:https://www.cnblogs.com/yejiang/p/13499638.html