高性能mysql一.mysql系统结构和概念

2023-11-07


前言:mysql架构设计将查询处理和其他系统任务和数据的存储/提取相互分离,这种存储和处理分离,可以在使用时根据性能,特性,以及其他需求选择数据的存储形式

1.1Mysql逻辑架构

简化版
官网

1.1.1连接管理和安全性

连接管理:每个客户端连接都会在服务器进程中拥有一个线程,服务端会负责缓存线程,不需要为每个新建的连接创建或者销毁线程
权限管理:客户端连接服务端需要auth验证,连接成功后继续判断是否有操作某表或者库的权限

1.1.2优化与执行

mysql会对解析后的sql进行重写查询,决定表读取顺序,选择合适索引等,可以通过explain进行查看优化情况

1.2并发控制

mysql会在服务层与存储引擎层两个方面解决并发问题

1.2.1读写锁

在处理并发读或者并发写时,可以通过实现两种类型的组成的锁系统来解决问题,共享锁,也叫读锁, 排他锁也叫血锁

1.2.2锁粒度

锁策略就是在锁的开销和数据的安全性之间寻找平衡
表锁:是mysql最基本的锁策略,开销最小,在特定的情况下,表锁也可能具有良好的性能,另外,写锁也比读锁具有更高的优先级
行级锁:最大程度支持并发,同时带来最大的锁开销

1.3事务

事务就是一组原子性的sql查询,或者是说一个独立的单元
ACID:表示原子性atomicity 一致性consistency 隔离性isolation 持久性durability

1.3.1隔离级别

Read uncommitted未提交
事务A修改,但没提交, 事务b是可以读到的, 这也成为脏读

Read committed提交度
大多数数据库默认级别,一个事务在开始时 , 可以"看到"所有已经提交的事务所做的修改, 也就是说,两次执行同样的查询,读到的结果可能不一样,这个级别有时也称为不可重复读

Repeatable read可重复读
解决了脏读,该级别保证在同一个事务中多次读取相同的记录结果是一样的; 但理论上,该级别无法解决另一个幻读的情况, 目前Innodb和xtradb存储引擎通过mvcc多版本并发控制解决了幻读问题

Seriaizable串行化
强制事务串行化执行

1.3.2死锁

死锁是指两个及以上事务在同一个资源上相互占用,相互等待,产生恶性循环
解决方案:一.死锁检测,检测死锁的虚幻依赖
二.检测查询时间是否达到锁等待时间
innodb处理死锁的方法是,将持有最少行级锁的事务进行回滚

1.3.3事务日志

事务日志可以帮助提高事务的效率.使用事物日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改行为记录到持久在硬盘的事务日志中,而不用每次将修改的数据本身持久到磁盘;
事务日志采用追加的方式,在磁盘上开辟一小块区域内进行顺序i/o, 不像随机io需要在磁盘上移动磁头;
事务日志持久以后,内存中被修改的数据在后台可以慢慢刷回磁盘,我们称之为预写式日志write ahead logging 修改数据需要写两次磁盘

1.3.4mysql中的事务

mysql提供两种事务型存储引擎,innodb和NDB Cluster
自动提交
mysql默认采用自动提交autocommit,也就是说,如果不是显性开始事务,则每个查询都会被当成一个事务执行提交操作
show variables like “autocommit”

DDL数据定义语言,如果导致大量数据改变的操作如alter table ,lock tables等会在执行前强制执行commit提交当前的活动事务

1.4多版本并发控制

MVCC的实现,是通过保存数据在某个时间点的快照来实现的.
Innodb的MVCC,是通过在每个记录后面保存两个隐藏列来实现的;这两个列,一个保存了行的创建时间版本号,一个是删除时间版本号;每开始一个新的事务,系统版本号都会自动递增,事务开始时刻的版本号作为事务的版本号,用来和查询到的每行记录版本号进行对比, 在repeatable read级别下 mvcc是如何操作的
SELECT
a.Innodb只查询小于等于当前事务版本的数据行,目的是保证查到的数据是之前存在或则当前事务插入或者修改的
b.行删除版本要么未定义,要么大于当前事务版本号,保障读到的行在时候之前未被删除
INSERT
Innodb为新插入的每一行保存当前系统版本号作为当前行的版本号
DALETE
Innodb为删除的每一行保存当前系统版本号作为删除标识
UPDATE
Innodb为插入一行新记录,保存当前系统版本号作为当前行版本号,同时保存当前系统版本号到原来的行作为删除标识

保存了两个而外的系统版本号,使大多数读操作不用加锁,操作简单,性能很好,但是使用了额外空间,需要做更多检查的工作,以及额外的维护工作
!!注意 MVCC只在repeatable read 和 read commit两种级别下工作,其他两种级别与mvcc不兼容

1.5mysql存储引擎

在文件系统中,mysql每个数据库(也称为schema)保存少数据目录下一个子目录,创建表时,在目录下创建一个和表同名的.frm文件
可通过获取表信息
show table status like “tablename”

1.5.1Innodb存储引擎

Innodb是mysql默认的事务引擎,Innodb的性能和自动奔溃恢复特性,使得它在非事务型存储的需求中也很流行
Innodb概览
在mysql4.1版本后,Innodb将每个表的数据和索引放在当读的文件
Innodb通过mvcc支持高并发,通过间隔锁next-key-locking防止幻读的出现
Innodb表是基于聚簇索引建立的,聚簇索引对主键查询有很高的性能,不过它的二级索引中必须包含主键索引
从mysql4.1开始,将每个innodb引擎的表单独存放在一个独立的ibd文件中

1.5.2mylsam存储引擎

在5.1及以前版本,mylsam是默认的存储引擎,提供了大量的特性,包括全文检索,压缩,空间函数等,但不支持事务和行级锁,最重要的是不支持崩溃恢复
存储:表会放到两个文件 数据文件.myd 和 索引文件myi

1.5.3查看数据库支持的引擎
show engines

在这里插入图片描述

1.5.4支持的通信方式

1.TCP/IP
TCP/IP是mysql数据库在任何平台都支持的连接方式,也是网络中使用最多的方式之一.
2.命名管道和共享内存
3.Unix域套接字
这不算是一种网络协议,在Linux和Unix环境下,需保证mysql客户端和服务端在同一台服务器上使用

1.5.5转换表的引擎

alter table
优点:适用任何引擎
缺点:执行时间过长
导出与导入
适用mysqldump工具导出文件,然后修改文件中create table语句中存储引擎语句
创建与删除
该方法比第一种高效比第二种安全 ,县创建新表 通过insert … select导出数据

参考:高性能mysql mysql技术内幕-innodb

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高性能mysql一.mysql系统结构和概念 的相关文章

  • MySQL 布尔模式匹配对中间词不返回任何内容

    我在 MySQL 数据库中使用 Match Against 时遇到问题 希望有人能提供帮助 这是我的数据库中的数据示例 id name 1 really bitter chocolate 2 soft cheese 当我运行此查询时 SEL
  • 将mysql数据导入kubernetes pod

    有谁知道如何将我的 dump sql 文件中的数据导入到 kubernetes pod 中 直接 与处理 docker 容器的方式相同 docker exec i container name mysql uroot password se
  • 如何准备更新查询语句? [复制]

    这个问题在这里已经有答案了 我有一个 mysqli 查询 代码如下 db usag gt query UPDATE Applicant SET phone number phone number street name street nam
  • 查找至少有 2 名员工的部门

    我需要做sql问题将显示至少有 2 人的所有部门 SELECT department name FROM department INNER JOIN employee ON department id employee department
  • 如何将 PHP 数组中的值插入到 MySQL 表中?

    我正在创建一个注册表单 其中包含姓名 电子邮件和电话号码字段 为了检查用户输入的有效性 我有一个函数validate input 返回一个数组 arr包含用户输入的输入 如果用户输入有效 arr然后传递给一个单独的函数 该函数将值插入arr
  • 当按第三个分组时,MySQL 根据另一个字段的最小值更新字段

    我已经阅读了几个关于选择最小值 分组等的线程 但似乎无法创建有效的查询来解决这个问题 如有重复 敬请原谅 我有一个像这样的表 ID Date Value Tag 1 1 1 13 500 NULL 2 1 1 13 10 NULL 3 1
  • 在 Magento 中编辑产品时 MySQL 错误

    这是 v 1 4 1 1 Magento 从 v 1 3 2 4 升级当我尝试编辑产品时 出现错误消息 exception Zend Db Statement Exception with message SQLSTATE 23000 In
  • 如何在SQL中编写连接查询[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 问题 给定 Employee 和 AnnualReviews 表 编写一个查询以返回所有从未接受过按 HireDate 排序的评论的员
  • 如何列出允许登录mysql的ip?

    我知道使用下面的命令 可以允许远程IP登录MySQL GRANT select insert update delete ON TO root my ip IDENTIFIED BY my password FLUSH PRIVILEGES
  • 我的表是什么 ROW_FORMAT?

    我发现MySQL有多行格式 http dev mysql com doc refman 5 1 en data size html 并且可以指定或更改它 另外 默认的 ROW FORMAT 显然随着 MySQL 版本的变化而改变 这是可以理
  • 计算唯一值的数量

    如果我有三列 orderNumber name email 我想计算表中有多少个唯一的电子邮件 我该怎么做 像这样的声明 SELECT count email FROM orders 给我总数 I tried SELECT DISTINCT
  • 同步不同数据库的2个表-MySQL

    我在数据库表中有一个包含某些医疗信息的表 我每天抓取并解析它们并将其存储在本地数据库的表中 假设最初有 1500 条记录 今天我的本地计算机上又添加了 100 条记录 现在 我有一个服务器 我需要在其中推送这些记录 因此数据库是不同的 我昨
  • mysql 修改全文搜索的停用词列表

    我搜索了很多 据说我必须编辑 my cnf 文件来更改停用词列表 我将 my medium cnf 重命名为 my cnf 并添加了 ft query expansion limit 和 ft stopword file 条件 我已经重新启
  • MySQL - 重命名列

    如何重命名 mysql 列help to content在我的桌子上tbl help mysql query ALTER TABLE tbl help CHANGE COLUMN help content 您必须在更改列语句中包含列的定义
  • Rails 创建 schema_migrations - Mysql2::Error: 指定的键太长

    我正在使用Rails 3 2 6和Mysql 6 0 9 但我在MySQL 5 2 25上有完全相同的错误 当我创建新数据库时 rake db create 然后当我尝试加载架构时 rake schema load 我收到此错误 Mysql
  • MySQL更改表,添加具有唯一随机值的列

    我有一个表 我添加了一个名为phone 该表还有一个 id 设置为自动增量的主键 如何将随机值插入到电话列中 该值不会重复 以下 UPDATE 语句确实插入了随机值 但并非所有值都是唯一的 另外 我没有被卖掉 我投了phone字段也正确 但
  • 如何在 sqlSave() 命令中跳过主键?

    我正在尝试使用 RODBC 在 MySQL 数据库中插入 data frame 我正在使用的命令如下 sqlSave channel dbData tablename table name append TRUE safer TRUE fa
  • MAMP Python-MySQLdb 问题:调用 Python 文件后 libssl.1.0.0.dylib 的路径发生变化

    我正在尝试使用 python MySQLdb 访问 MAMP 服务器上的 MySQL 数据库 当我最初尝试使用 python sql 调用 Python 文件来访问 MAMP 上的数据库时 我得到了image not found关于错误li
  • mysql - 有什么方法可以帮助使用另一个索引进行全文搜索?

    假设我有一个 文章 表 其中包含以下列 article text fulltext indexed author id indexed 现在我想搜索特定作者撰写的文章中出现的术语 所以像这样 select from articles whe
  • MySQL 性能 DELETE 或 UPDATE?

    我有一个超过 10 7 行的 MyISAM 表 向其中添加数据时 我必须在最后更新 10 行 删除它们然后插入新行更快 还是更新这些行更快 应更新的数据不是索引的一部分 索引 数据碎片怎么样 UPDATE到目前为止要快得多 当你UPDATE

随机推荐

  • mysql:ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value:

    发现某个组件的表单输入报错 Error ER TRUNCATED WRONG VALUE FOR FIELD Incorrect string value xE6 x88 x91 xE4 xBB xAC for column content
  • 【算法与数据结构】235、LeetCode二叉搜索树的最近公共祖先

    文章目录 一 题目 二 解法 三 完整代码 所有的LeetCode题解索引 可以看这篇文章 算法和数据结构 LeetCode题解 一 题目 二 解法 思路分析 本题和这道题类似 算法与数据结构 236 LeetCode二叉树的最近公共祖先
  • Linux下Samba的配置

    参考 http www cnblogs com mchina archive 2012 12 18 2816717 html 前言 为了实现windows 和 Linux以及其他操作系统之间的资源共享 软件商推出nfs 和samba两种解决
  • Air101

    目录 1 合宙Air101 固件编译可参考 PinOut V2 1092400 管脚映射表 PinOut V2 1091800 2 Air103 最新固件下载 固件编译可参考 PinOut V3 21112201 管脚映射表 资料链接 Pi
  • Solid JS基础

    Solid js 用于构建用户界面的声明式 高效且灵活的 JavaScript 库 您可以在 官方教程 中尝试下面提到的部分例子 本文引用并简化了官方教程中的部分例子 本文讲述部分 solid 主要内容 更多详细内容 移步 Solid AP
  • 编码器的使用

    首先来看一下增量式编码器的输出信号和它的信号倍频技术 增量式编码器输出的脉冲波形信号形式常见的有两种 一种是占空比50 的方波 通道A和B相位差为90 另一种则是正弦波这类模拟信号 通道A和B相位差同样为90 对于第1种形式的方波信号 如果
  • MATLAB量化浮点数

    在做算法设计和验证时 常在matlab进行浮点验证 然后量化后在用在FPGA上 对于类似与FIR这些滤波器系数 matlab直接可以export出来 但是在验证麦克风或者ADC出来的24bit补码这类时常常需要使用matlab生成定点数进行
  • 有关DHCP、链路聚合、NAT、ACL、Telnet配置小综合实验

    实验需求 1 局域网中存在VLAN10 VLAN20 VLAN30和VLAN40四个部门 IP网段 应192 168 10 0 24 192 168 20 0 24 192 168 30 0 24 192 168 40 0 24 2 业务V
  • Linux虚拟机 Ubuntu16 cheese命令打开摄像头黑屏,以及mjpg-stream框架不显示视频界面。

    在Linux虚拟机 Ubuntu16打开笔记本的摄像头时 用 ubuntu16的cheese命令显示黑屏 如下图 解决方法 1 查看虚拟机是否已经已连接上摄像头 显示断开连接 连接主机 D 则虚拟机已连接上摄像头 2 确认摄像头 笔记本的摄
  • 搭建环境【2】windows主机和ubuntu互传文件的4种方法

    我的ubuntu系统是安装在 VMware 虚拟机中的 两者之间经常要互传文件 下面介绍4种常用的互传文件方法 1 共享文件夹方式互传 在虚拟机中需要开启共享文件夹的功能 首先虚拟机中的ubuntu要求是已经开机了的状态 然后进行设置 虚拟
  • 山东轻工业学院高校俱乐部主席“我和我的CSDN高校俱乐部”

    今天天气不错 上午收到了CSDN邮寄过来的2012年度优秀主席证书以及奖品 心情也不错 感谢CSDN教育事业部全体同事一年来对我们工作的支持与帮助 同时也感谢那些奋战在一线的兄弟姐妹们 你们为轻工学院CSDN高校俱乐部所做的一切 我永远铭记
  • ThreadLocal - ThreadlMap与弱引用

    ThreadLocal源码 在看ThreadLocal源码的时候 其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc static class ThreadLocalMap static class Entr
  • C++ string字符串修改和替换方法详解

    字符串内容的变化包括修改和替换两种 本节将分别讲解字符串内容的修改和字符串内容的替换 字符串内容的修改 可以通过使用多个函数修改字符串的值 例如 assign operator erase 交换 swap 插入 insert 等 另外 还可
  • 使用Guava RateLimiter限流以及源码解析

    前言 在开发高并发系统时有三把利器用来保护系统 缓存 降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时 需要暂时屏蔽掉 待高峰或者问题解决后再打开 限流 限流的目的是通过对并发
  • win10 graphedit存储的路径

    如果安装郭windows SDK的话 可能的存储位置为C Program Files x86 Windows Kits 10 bin x86 C Program Files x86 Windows Kits 10 bin x64
  • 【C语言学习教程---2】C语言的数据类型

    事物的难度远远低于对事物的恐惧 上一篇文章已经介绍说明了Visual C 的安装和使用 链接如下 C语言学习教程 1 VC 6 0的安装和创建简单C语言工程文件教程 文末有程序代码免费的获取方式 本篇文章开始正式讲解和介绍C语言的知识 在学
  • 安装破解版的edraw max

    一 简介 project是一款好用的项目管理工具 二 安装过程 1 下载安装包 安装软件 安装后先不要运行 https pan baidu com share init surl gKfohSW8XEn 9cYLwnJwdQ h3um 2
  • git:git clone -b提示remote branch master not found in upstream origin

    问题 如标题 解决办法 检查下分支名是否写错了 git创建时有时候不一定有master分支 而是main分支 需要注意
  • Selenium webdriver的无头模式(headless)可能导致cookies内容缺失,以及解决措施

    无头模式 headless 是selenium的webdriver浏览器驱动的一项功能 允许浏览器不出现而仍可访问网页 并与之交互 这对于运行自动化测试或网络抓包大有用处 因为运行速度更快 占用资源更少 但是笔者发现在无头模式下运行时 浏览
  • 高性能mysql一.mysql系统结构和概念

    文章目录 1 1Mysql逻辑架构 1 1 1连接管理和安全性 1 1 2优化与执行 1 2并发控制 1 2 1读写锁 1 2 2锁粒度 1 3事务 1 3 1隔离级别 1 3 2死锁 1 3 3事务日志 1 3 4mysql中的事务 1