MySQL架构基本知识

  1、锁机制

  1)在处理并发读写时,通常使用一套锁系统来解决问题。锁系统由读锁(又称共享锁)和写锁(又称排他锁)组成。

  2)每一种锁操作(如获得锁、检查锁是否已解除、释放锁),都会增加系统开销。锁策略就是在锁开销和数据安全之间寻求一种平衡。MySQL的每种存储引擎都可以实现独有的锁策略或锁粒度。在存储引擎设计中,锁管理是个非常重要的议题。两种最重要的锁策略:

  (1)行级锁:可以支持最大的并发处理能力,但也带来最大的锁开销。行级锁由存储引擎(如InnoDB)实现,服务器完全不了解存储引擎里的锁实现方式。

  (2)表级锁:开销最小。

  由于通常认为表更新比表检索更重要,因此写锁比读锁有更高的优先级。

  虽然存储引擎管理自己的锁,但MySQL本身也能使用各种有效的表级锁,如MySQL服务器在ALTER TABLE语句中使用表级锁,而不用考虑存储引擎。

  以下的内容仅用于讨论MyISAM(如下图)。对于使用InnoDB存储引擎的表,读者可以自行测试。

  

  使用表级锁的时候,读写一般是串行的。但使用READ LOCAL表级锁可以支持某种类型的并发写操作,如下面的图文说明:

  I、此时concurrent_insert变量为1,且表没有出现空洞(自表创建以来,还没有删除操作)。如图,在session 1中对表使用read local表级锁,在session 2中可以执行插入操作,但session 1要unlock tables之后才能看到session 2刚刚插入的数据。图中序号标识操作的顺序。

  

  以下三种情况可以用来作为对比,图略:

  若session 1使用read local表级锁,session 2执行update操作,则会被阻塞。

  若session 1只使用read表级锁,自然地,session 2插入数据时会阻塞,直到读锁释放。

  若session 1获得读锁(read和read local),则它再进行插入或更新操作时都会报错。

  II、此时concurrent_insert变量为1。删除id=4的记录,表出现了空洞。如图,在session 1中对表使用read local表级锁,则session 2的插入操作会阻塞。

  

  此时可以使用optimize table来进行碎片整理。如图,使用该命令之后,上述的并发插入操作不再阻塞。

    

  III、还是上面的表(使用optimize table之前的有空洞的表),但设置concurrent_insert为2。如图,session 1对表使用了read local表级锁,session 2可以执行插入操作。

  

  总结:

  read local和read都是表级读锁,但前者允许在一定条件下,对读锁定的表执行并发插入操作。

  concurrent_insert全局变量可以通过两种方式取得:在mysql命令行中执行show global variables like ‘%concurrent_insert%‘;,或者在shell命令行中执行mysqladmin -u username -p passwd variables |grep concurrent_insert;另外,可以通过set global concurrent_insert = 0/1/2设置该变量。它主要用于控制并发插入行为:

  当它为0时,不允许并发插入(与实际测试不符?);

  当它为1(默认值)时,若表不存在空洞,则允许并发插入;否则,不允许并发插入;

  当它为2时,即使表存在空洞,也允许并发插入。

  为什么表存在空洞与否对并发插入有影响呢?参考mysql命令行的help optimize table命令(“删除的行会在一个链表中维护,并且后续的插入操作会重用这些旧有的行的位置”),再结合上面的讨论,可知大概的组织图如下。

  表中不存在空洞时,插入数据会在图中最下方的区域,此时无论concurrent_insert为1还是2,插入操作都不会和锁构成“竞争”关系,因此不会阻塞;表存在空洞时,由于系统要重用空洞区域,所以区分了以下情形:concurrent_insert为1时,认为是要重用空洞区域,但由于被锁定,所以插入操作阻塞;concurrent_insert为2时,认为先暂时不用空洞区域,而是插入到图中最下方的区域,和锁构不成“竞争”关系,因而插入操作不会阻塞。

  optimize table碎片整理之后,图中空洞区域被重用,即不再存在空洞,因此concurrent_insert为1时,也可以执行并发插入操作了。

  另外,update操作由于是更新read local锁定的区域内的记录,和锁构成“竞争”关系,所以会阻塞。

  

  参考资料:

  《高性能MySQL》

不断学习中。。。

时间: 2024-08-27 09:37:52

MySQL架构基本知识的相关文章

步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的‘SQL Layer’,下层是各种各样对上提供接口的存储引擎,被称为‘Storage Engin

MySQL架构总览->查询执行流程->SQL解析顺序

前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的'SQL Layer',下层是各种各样对上提供接口的存储引擎,被称为'Storage Engin

数据库学习之--Oracle 架构与MySQL架构对比

数据库学习之--Oracle 架构与MySQL架构对比 一.Oracle .MySQL应用对比 如果要说明三者的区别,首先就要从历史入手. Oracle:中文译作甲骨文,这是一家传奇的公司,有一个传奇的大老板Larry Ellision. Ellision 32岁还一事无成,读了三个大学,没得到一个学位文凭,换了十几家公司,老婆也离他而去.开始创业时只有1200美元,却使得Oracle公司连续12年销售额每年翻一番. Oracle成立于1977年,早期的理论基础,反而来自于一篇IBM的论文<A

MySQL/MariaDB基础性知识及DDL操作详解

前言 MySQL/MariaDB是一个开放源码的小型关联式数据库管理系统,由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL/MariaDB作为网站数据库. 基础架构 MySQL核心组件 连接池:认证.线程重用.连接数限制.内存检查.缓存 SQL接口:DDL, DML, 关系型数据库的基本抽象 parser: 查询转换.对象权限检查 优化器:访问路径,性能相关的统计数据 caches和buffers:与存储引擎自身相关的I/O性

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

MySQL 架构组成--物理文件组成

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一.MySQL Server 简介 什么是MySQL? 答:是目前IT行业最流行的开放源代码的数据库管理系统之一,它同时也是一个支持多线程高并发多用户的关系型数据库管理系统. 特点: 简单:安装简单 高效:读写性能高,仅次于oracle 可靠:运行稳定 MySQL 与其他数据库的简单比较: 1)       功能比较 2)       易

mysql架构演变

假设一个网站(discuz)从最开始访问量很小做到日pv千万,我们来推测一下它的mysql服务器架构演变过程. 第一阶段网站访问量日pv量级在1w以下.单台机器跑web和db,不需要做架构层调优(比如,不需要增加memcached缓存).此时,数据往往都是每日冷备份的,但有时候如果考虑数据安全性,会搭建一个mysql主从. 第二阶段网站访问量日pv达到几万.此时单台机器已经有点负载,需要我们把web和db分开,需要搭建memcached服务作为缓存.也就是说,在这个阶段,我们还可以使用单台机器跑

MYSQL 架构

1.一般都做主从,主一个从两个. 2.如果服务器出现故障怎么做故障转移? 初级:如果主库出现问题,就看是否是主库硬件问题,导致短期时间内无法恢复.如果短期内无法恢复就切从库.(INNODB 断电数据读不会丢,他会写到磁盘,开机自动恢复) 切从库需要程序去判断,然后修改用户权限,因为一般对从库只有只读权限.复制用同步复制,异步总会有数据丢失. 高级:MMM,MHA 详细介绍复制:(参考高性能MYSQL) 1.1.复制解决的问题数据复制技术有以下一些特点:(1)    数据分布(2)    负载平衡

mysql 索引相关知识

由where 1 =1 引发的思考 最近工作上被说了 说代码中不能用 where 1=1,当时觉得是应该可以用的,但是找不到什么理据, 而且mysql 语句优化这方面确实很薄弱 感觉自己mysql方面是知识还是不够哇 得好好研究研究 还有发现 很多知识点 光看的话根本记不住,也不深刻.还是得亲手实践下 so  ~~~ 挫折越多进步越快 1.关于sql语句大小问题 1)mysql默认情况下没有设置 root用户密码 给mysql的root用户设置密码先 [[email protected] ~]$