高性能Mysql笔记(一)

MySQL架构与历史

1.1 .1MySQL服务器逻辑架构

在这里插入图片描述
大致上分为三层,下面来介绍这三层的作用

  • 第一层
    客户端/服务端的工具都有类似的架构。比如:连接处理,授权认证等等。

  • 第二层
    MYSQL的核心服务功能都在这一层。比如:查询解析、优化、缓存以及内置函数(日期,数学和加密函数),存储过程,触发器,视图等。

  • 第三层
    存储引擎,服务器通过API与存储引擎进行通信。
    存储引擎不会解析SQL,不同存储引擎之间不会相互通信。(InnoDB例外,他会解析外键定义。)
    (后面会详细介绍分类)

    1.1.2 连接管理与安全性

    线程的定义:
    线程包含在进程之中。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
    连接管理
    每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个的单独的线程中执行。(MYSQL5.5或更新的版本,提供方了一个API,支持线程池插件,可以使用池中少量的线程来服务大量的连接)

  • 安全性
    客户端连接MYSQL服务器时,服务器对其进行认证,包括用户名,密码等。

1.2 并发控制

当我们同时对一张表做插入或者修改时,会引发并发控制的问题。这类问题,一般通过实现一个由两种类型的锁组成的锁系统来解决问题,称为共享锁排他锁,也叫读锁写锁

读锁(共享锁):读锁是共享的,或者说是相互不阻塞的,多个客户在同一时刻可以同时读取同一个资源,而且互不干扰。

写锁(排它锁):写锁会阻塞其他的读锁和写锁,一个用户在修改某个数据时,MySQL会同时阻塞其他用户对此数据的操作。

一种提高共享资源并发性的方式就是让锁对象更有选择性,尽量只锁定需要修改的部分数据,而不是所有的资源。
这里我们来讲一下**锁策略**,就是在锁的开销和数据的安全性之间寻求平衡。

在这里插入图片描述

1.3事务

  • 原子性
    整个事务中所有操作要么全部提交成功,要么全部失败回滚。

  • 一致性
    事务必须是使数据库从一个一致性状态变到另一个一致性状态。

  • 隔离性
    一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

  • 持久性
    持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响

    1.3.1 隔离级别

  • 未提交读(脏读)
    事务中的修改,即使没有提交,对其他事务也是可见的。

  • 提交读
    一个事务从开始到提交之前,所做的任何修改对其他事务都是不可见的。

  • 可重复读
    解决了脏读的问题,但产生了幻读,就是当某个事务在读取该范围的记录时,另外一个事务又在该范围插入新的记录,当之前的事务再次读取该范围的记录则产生幻行。

  • 可串行化
    最高的隔离级别。通过强制串行执行,避免了幻读的问题。

    1.3.2 死锁
    死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

    1.3.3 MYSQL中的事务
    MYSQL提供了两种事务型的存储引擎:InnoDB和NDB Cluster。

    隐式和显示锁定
    隐式锁定:采用两阶段锁定协议,在事务执行过程中,随时都可以执行锁定,锁只有在执行提交和回滚的市时候才释放,并且所有的锁在统一时刻被释放。InnoDB会根据隔离级别在需要的时候自动加锁。
    显示锁定:通过特定的语句进行显示锁定
    select … lock in share mode
    select … for update
    1.4多版本并发控制

MYSQL的大多数事务型存储引擎实现都不是简单的行级锁,基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)
这里看这个解释的比较好。
MVCC多版本并发控制

1.5 MYSQL的存储引擎

  • InnoDB存储引擎
    InnoDB是MySQL的默认事务型引擎,也是最重要,使用最广泛的存储引擎。
    InnoDB采用MVCC来支持高并发,实现了四个标准的隔离级别。
    InnoDB表是基于聚簇索引建立的。(聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据)
    InnoDB能够自动在内存中创建hash索引以加速读操作的自适应哈希索引,以及能够加速插入操作的插入缓冲区。

  • MyISAM存储引擎
    MyISAM存在大量的特性,包括全文索引,压缩,空间函数等,但是它不支持事务和行级锁,而且崩溃后无法安全恢复。对于只读的数据,或者表小,可以忍受修复操作,则可以选择MyISAM。
    MyISAM会将表存储到两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名。

    1.5.1 MySQL 内建的其他存储引擎

  • Archive引擎
    只支持INSERT和SELECT操作。在MySQL5.1之前不支持索引。适合日志和数据采集类应用。Archive引擎支持行级锁和专用的缓冲区,可以实现高并发的插入。

  • Blackhole引擎
    没有实现任何的存储机制,会丢弃所有插入的数据,不做任何保存。

  • CSV引擎
    可以将普通的CSV文件(逗号分割值的文件)作为MySQL的表来处理,但不支持索引。

  • Memory引擎
    想要快速访问数据,并且数据不会被修改,重启丢失也无所谓,可选择使用Memory表。
    1.5.2 转换表的引擎

  • ALTER TABLE

ALTER TABLE mytable ENGINE = InnoDB;

该方法适用任何存储引擎。缺点:需要执行很长时间。

  • 导出导入
    使用mysqldump工具将数据导出到文件,然后修改文件中的CREATE TABLE语句的存储引擎选项,同时修改表明。
  • 创建与查询
    创建新的存储引擎的表,在利用INSERT…SELECT语法导入数据

总结:
Mysql拥有分层的架构。上层是服务器层的服务和查询执行引擎,下层是存储引擎。MYSQL的核心基础结构的精髓是理解MYSQL在存储引擎和服务层之间处理查询时如何通过API来回交互。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值