第一章 Mysql架构与历史

结构图镇楼

高性能mysql 第3版 豆瓣 高性能mysql第3版 pdf_高性能mysql 第3版 豆瓣

图片介绍可能不清晰这里具体说明一下

具体流程应该是

  1. 客户端发起一个sql
  2. 查看是否能在缓存中命中,如果命中就返回,没有命中就进入解析器
  3. 图中的解析器可以拆分为3部分 :解析器:查看sql语句是否合法,分析器查看sql内容中存在的需要查询的表,字段是否存在,优化器:mysql会自己根据sql 来优化查询顺序,使用哪种索引来进行查询,达到一个优化的作用,我们可以通过hint 或者 explan 来查看sql的具体执行
  4. 到存储引擎中,更具具体引擎的规则来查询数据
  5. 查询到的结果返回到客户端的时候要先把数据放入到 高速缓存中,然后在返回给客户端
    以上是一个sql的执行过程了
  6. 这里说明一下 sql的执行顺序 有些同学可能会在面试的过程中被问到

    这里可以看到limit是最后执行的,所以这里会有一个考点,是通过limit是否能提高一条sql的执行效率,这里要说明一下一条sql执行时是先查询到所有符合条件的数据之后在通过limit的要求来进行分页的,也就是说查询的时候不会先把数据分页在根据条件查询,所以分页是不能优化执行效率的,主要是减轻前端页面的展示压力。
这里解释一下锁
  1. 共享锁(读锁)他们是一回事,主要是在读的时候锁是共享的,相互之间是不阻塞的。
  2. 排他锁(写锁)他们也一样,主要是在写的时候使用的,目的是我在修改的时候不允许你们来进行操作。而且他的锁级别会比共享锁高,能插队到共享锁之前,而共享锁不能插队排他锁。
  3. 表锁,锁一张表简单易懂效率低,但是开销最小的策略
  4. 行锁,锁定一个需要修改的内容,这样不会影响其他数据。但是开销大,主要存在在搜索引擎中使用如innoDB和XtraDB中
  5. 死锁,是指两个事务要获取对方的资源,两个事务之间又不共享资源相互等待的情况。解决办法是回滚其中一个事务,然后在执行回滚的事务。
这里解释一下事物
  1. 事务是一组原子性的sql查询,是不可以独立执行的,在一个事务内的一系列操作要么成功要么失败。
  2. 原子性(atomicity):一个事务中的操作要么全部成功,要么全部失败回滚,不可能单独执行一部分,这就是原子性。
  3. 一致性(consistency):一个事务总是从一个一致性变换到另外一个一致性上,不会存在事务结果不一致的情况,因为变换的过程中事务没有被提交。
  4. 隔离性(isloation):一般来说一个事务在完成提交前是对其他事物不可见的。
  5. 持久性(durabiity):一点事务提交那么事务结果就会持久化道数据库中,不会存在丢失的情况。
事务隔离级别
  1. READ UNCOMMITTED (未提交读)是个是指在事务执行中还没有提交也会被其他事务读取到。脏读
  2. READ COMMITTED(提交读)大部分数据库的默认级别,mysql不是,指的是提交之后数据其他事务才可以查看到。也叫不可重复度因为两次执行的效果可能得到不通的一个结果。
  3. REPEATABLE READ (可重复度),这个是mysql的默认级别,他会造成幻读问题。是指一个事务在读区范围数据是,有另外一个事务在修改这个范围内的数据,造成读区范围数据的事务出现幻行。
  4. SERIALIZABLE(可串行化)可以解决幻读,他会在每一行的数据都加锁,开销很大,慎用,因为大量时间都在加锁和竞争锁上了。
  5. 事务日志;事务日志的使用可以提高事务的效率。事务在修改数据的时候只需要修改内存中的备份,然后记录到事务日志中,然后被修改的数据在缓慢落到磁盘上。事务日志是顺序I/O,不是随机I/O需要多个地方移动磁盘。而且落到事务日志上也不会造成数据丢失,如果服务器挂了,会通过事务日志来读取修改内容。目前的大部分执行引擎都是这么做的。
这里解释下MVCC

MVCC 可以看作是行锁的一种变种,主要实现有悲观锁和乐观锁。
举例 InnoDB的MVCC就是通过在记录后增加两个隐藏行来实现,1个保存行的过期时间(删除时间),1个保存行的创建时间。

MySql的存储引擎

InnoDB

  1. InnoDB的数据存储在表空间中,表空间是由 InnoDB管理的一个黑盒,它把每个表的数据和索引放在一个文件中。
  2. InnoDB采用MVCC来处理高并发,支持4种隔离级别默认是可重复,采取间隙锁来防止幻读。
  3. InnoDB是由聚簇索引建立的,聚簇索引对主键的查询效率很高,但是他的二级索引中必须包含主键索引,所以主键索引如果很大,二级索引一般会很臃肿。

MyISAM

  1. 支持全文检索、压缩、空间函数但是不支持事务、和行锁,而且崩溃了不能安全的恢复数据。
  2. 会把表存储在两个文件中,一个数据文件 .MYD,一个索引文件.MYI
  3. 支持表锁,读取时对所有表加共享锁,写时加排他锁。但是在读区操作的同时支持写入。并发插入

Archive

  1. 只支持查询和插入操作。
  2. 5.1之前不支持索引
  3. 支持行级锁和专用缓冲区,可以实现高并发插入。

CVS引擎

CVS引擎可以将普通的CSV文件(逗号分割值的文件)作为MySQL 的表来处理,但
这种表不支持索引。CSV引擎可以在数据库运行时拷入或者拷出文件。可以将Excel
等电子表格软件中的数据存储为cV文件,然后复制到MySQL 数据目录下,就能在
MySQL 中打开使用。同样,如果将数据写入到一个CSV引擎表,其他的外部程序也能
立即从表的数据文件中读取CSV格式的数据。因此CSV引擎可以作为一种数据交换的机制,非常有用。