第一章: Mysql体系结构和存储引擎

2023-10-27

1.1 定义数据库和实例

数据库和实例的区别?

数据库是物理操作系统或其他形式文件的集合(数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合)。而数据库实例是真正用于操作数据库文件的(数据库实例是程序,是位于用户和操作系统之间一层数据管理软件),Mysql数据库由后台线程以及一个共享内存区组成,共享内存可以被运行的后台线程所共享。这两个概念有时候可以互相使用,但两者的概念完全不同,在Mysql数据库中,实例与数据库是一一对应的,即一个实例对应一个数据库,一个数据库对应一个实例,但是在集群情况下可能存在一个数据库被多个实例使用的情况。(Mysql被设计为一种单进程多线程架构的数据库,而数据库实例在系统上的表现就是一个进程)

当启动实例时,Mysql数据库会去读取配置文件,根据配置文件的参数来启动数据库实例。下面演示了如何查看mysql数据库在哪里:

mysql --help | grep my.cnf

在这里插入图片描述
可以看到Mysql数据库是按照/etc/my.cnf -> /ect/mysql/my.cnf -> /usr/local/mysql/etc/my.cnf -> ~/.my.cnf的顺序读取配置文件的。如果这几个配置文件配置了相同的参数,那么会以最后一个配置文件的参数为准。

1.2 Mysql体系结构

Mysql体系结构如如下:

在这里插入图片描述
上面的体系结构由下面几部分组成:

  • 连接池组件
  • 管理服务和工具组件
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓存组件
  • 插件式存储引擎
  • 物理文件

Mysql数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎,存储引擎是基于表的不是基于数据库的

1. 3 Mysql存储引擎

数据库最核心的一点就是用来存储数据,数据存储就避免不了和磁盘打交道。那么数据以哪种方式进行存储,如何存储是存储的关键所在。所以存储引擎就相当于是数据存储的发动机,来驱动数据在磁盘层面进行存储。不同的存储引擎功能差别很大。

  • InnoDB存储引擎

概念
InnoDB存储引擎支持事务,其设计的主要目标是在线事务处理(OLTP)的应用。其特点是行锁设计支持外键,是从5.5.8版本开始是Mysql的默认存储引擎。
特点

  1. InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为Repeatable级别。同时使用一种被称为next-key locking(临键锁)的策略来避免幻读现象的产生。
  2. InnoDB存储引擎提供了插入缓冲、二次写、自适应hash索引、预读等高性能和高可用功能。
  3. 对于表中的数据存储,InnoDB采用了聚集的方式,因此每张表的存储都是按主键的顺序进行存放的,如果没有显示的在表的定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。
  • MyISAM存储引擎

概念
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。

特点

  1. MyISAM存储引擎一个与众不同的地方就是它的缓存池只缓存索引文件,而不缓冲数据文件。
  2. MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件
  3. MyISAM存储引擎表,Mysql数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成。
  • NDB存储引擎

概念
NDB存储引擎时一个集群存储引擎,类似于ORACLE的RAC集群,其结构式shar nothing的集群架构,因此可以提供很高的可用性。

特点

  1. 数据全部放在内存中,(5.1开始可以将非索引数据放在磁盘上),因此主键查找的数据极快,并且可以通过添加NDB数据存储节点(Data Node)可以线性地提高数据库性能,是高可用、高性能的集群系统。
  2. NDB存储引擎的连接操作实在MYSQL数据库层完成的,而不是在存储引擎中完成的。这意味着,复杂的连接操作需要巨大的网络开销,因此查询速度很慢。

1. 4 常见问题解答

  • Mysql是否支持全文索引?

答:支持

  • Myslq数据库快是因为不支持事务吗?

答:错!虽然Mysql的MyISAM存储引擎不支持事务,但是InnoDB支持。

  • 当表的数据量大于1000万时Mysql的性能会急剧下降吗?

答:不!Mysql是数据库,不是文件,随着数据行数的增加,性能会有所下降,但是这些下降不是线性的,如果用户选择了正确的存储引擎,以及正确的配置,再多的数据mysql也能承受。
数据库和传统系统文件的区别是在于数据库支持事务

1.5 存储引擎相关操作语法

  • 查看当前使用Mysql数据库所支持的存储引擎
show engines\G;

在这里插入图片描述

1.6 连接Mysql

连接Mysql操作是一个连接进程和Mysql数据库实例进行通信

  • TCP/IP

TCP/IP套接字方式是Mysql数据库在任何平台下都提供的方式,也是网络中使用最多的方式。这种方式在TCP/IP连接上建立一个基于网络的连接请求。

mysql -h127.0.0.1 -u david -p 

注意:在通过TCP/IP连接到MYSQL实例时,MYSQL数据库会线检查一张权限视图,用来判断发起请求的客户端IP是否运行连接到Mysql实例。

use mysql;
select host,user from user;

在这里插入图片描述

表中四个user都只能通过localhost本地对mysql实例进行连接

  • 命名管道和共享内存

使用管道通信时,mysql需要在配置文件中启用--enable-named-pipe选项。在mysql 4.1之后的版本中,mysql还提供了共享内存的连接方式,这是通过在配置文件中添加--shared-memory实现的。如果想使用共享内存的连接方式,在连接时,Mysql客户端还必须使用--protocol=memory选项

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

第一章: Mysql体系结构和存储引擎 的相关文章

  • 正确显示mySQL一对多查询结果

    我有两张桌子 TRIPS tripID clientID and LEGS legID depart arrive tripID TRIPS 与 LEGS 具有一对多关系 因为有多个legID s per tripID 我需要以以下格式显示
  • Mysql为简单频繁查询创建排序索引性能

    我正在处理一个包含大约 400 万条消息条目的 mysql 表 并尝试根据时间戳选择最新的 50 条消息 另一个要求是返回的消息不以固定前缀开头 问题是单个查询大约占用 25 的 cpu 并且最多需要 1 5 秒 该查询经常由多个客户端执行
  • MySQL获取最后10条记录中的第一条记录

    在Mysql中 我试图获取最后10条记录中最旧的记录 为了得到最后 10 个我会简单地做SELECT FROM table ORDER BY id DESC LIMIT 10 为了获得最旧的 我只需使用 ASC 顺序 我需要首先按 DESC
  • MySql如何通过过滤多列来限制多个数字?

    我想从数据库中获取 4 个不同类别的 50 个问题 我想要 4 个不同类别中每个类别的不同数量的问题 我的结果集必须包含第一类 12 个问题 第二类 20 个问题 第三类 10 个问题和第四类 8 个问题 我的问题表中总共有 50 个问题
  • UNIX时间记录时区吗?

    我想问一下UNIX时间 UNIX时间是否记录时区 我将托管从美国芝加哥移至 JST 问题是我的整个 MySQL 数据库都有 UNIX 时间 芝加哥 美国时区 的记录 我有一个 PHP 代码来显示之前的时间 例如 3 天前 昨天等 当我搬到新
  • 按 MAX(time) WHERE time <= x 选择最近的 MySQL 行

    我正在选择 MySQL 表的最新条目 SELECT MAX time as most recent userID FROM TableName GROUP BY userID ORDER BY most recent DESC 我的问题是
  • PDO::commit 之后使用 PDOStatement::rowCount 结果?

    在 MySQL 文档中 有一个关于使用的注释mysql affected rows事务提交后 http php net manual en function mysql affected rows php http php net manu
  • ER_ACCESS_DENIED_ERROR:用户 ''@'localhost' 的访问被拒绝(使用密码:NO)

    我有这个问题 我已经研究过但无法解决它 我想它与数据库权限有关 但我无法修复它 if error throw error Error ER ACCESS DENIED ERROR Access denied for user localho
  • Rails 多租户架构,限制多个租户的访问范围

    目前我们有一个单租户数据库架构 MySQL 运行着超过 100 个数据库 我们使用 Apartment gem 切换子域上的数据库连接 一切都很顺利 然而 我们现在需要创建所谓的 伞 客户端 它可以访问一组现有客户端的所有数据 我不认为这对
  • 需要有关使用 PHP 在 mysql 数据库中插入逗号分隔数据的帮助

    数据库表中已有的演示数据 INSERT INTO csvtbl ID SKU Product Name Model Make Year From Year To VALUES 1 C2AZ 3B584 AR Power Steering P
  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • RMySQL fetch - 找不到继承的方法

    使用 RMySQL 我想将数据从数据库加载到 R 中的数据帧中 为此 我使用以下代码 R连接数据库 con lt dbConnect MySQL user root password password dbname prediction h
  • Laravel Group By 和 Order By 不起作用

    我尝试制作一个Laravel 5 8项目 项目中的数据是这样的 id purch name prcvalue 1 10234 Nabila 100 2 10234 Nadeera 450 3 10234 Nabila 540 4 10234
  • #1045 - 用户“root”@“localhost”的访问被拒绝(使用密码:YES)

    这可能看起来多余 但我无法找到正确的解决方案 我无法使用 mysql 控制台登录 mysql 它要求输入密码 但我不知道我实际输入的内容 有办法获取密码或更改密码吗 这就是我的 config inc 的样子 当我尝试打开 phpmyadmi
  • 从数据库 MYSQL 和 Codeigniter 获取信息

    如果你们需要其他信息 上一个问题就在这里 从数据库中获取信息 https stackoverflow com questions 13336744 fetching information from the database 另一个更新 尽
  • 如何使用 PHP 从 MySQL 检索特定值?

    好吧 我已经厌倦了 过去一周我花了大部分空闲时间试图解决这个问题 我知道 SQL 中的查询已更改 但我无法弄清楚 我能找到的所有其他帖子似乎都已经过时了 如果有人能帮助我 我将非常感激 我想做的就是使用手动输入数据库的唯一 密码 来检索行的
  • 高效插入和更新时检查唯一性

    我的员工表中有 2 列 每列值必须是唯一的 staff code staff name staff id staff code staff name 1 MGT Management 2 IT IT staff 当向表中插入或更新项目时 我
  • 哪个是识别关系或非识别关系中的子表?

    在表之间的识别和非识别关系的上下文中 MySQL 文档大量将表称为父表和子表 如何判断哪个表是父表 哪个表是子表 子表 A K A 弱实体 http en wikipedia org wiki Weak entity 是一个表 其主键属性d

随机推荐

  • java.io.IOException: Server returned HTTP response code: 403 for URL

    403 Forbidden 是HTTP协议中的一个状态码 Status Code 可以简单的理解为没有权限访问此站 引发的BUG java io IOException Server returned HTTP response code
  • python爬虫分享

    1 爬取网站 mmzztt 2 项目说明 根据model进行分类 model下面有图集 图集下面是图片 3 使用依赖 import random from selenium webdriver common by import By imp
  • 【TypeScript】TypeScript进阶

    函数式编程 函数作为 一等公民 变量类型可以是函数 以下代码推荐写成lambda表达式的形式 在JavaScript TypeScript中也被称为箭头函数 const compareNumber a number b number gt
  • Qt VS中双击ui文件无法打开的问题

    ui文件无法打开 或者是打开后报错的 突然间就来了这个问题 搞得我触不及防 不过还好 最总还是被我解决了 下面将解决办法下来了 供大家参考 一 双击ui文件无法打开 解决办法 右键ui文件 选择打开方式 选中Qt Designer 并将其设
  • php 域名恶意解析,防止恶意域名解析

    一 什么是恶意域名解析 一般情况下 要使域名能访问到网站需要两步 第一步 将域名解析到网站所在的主机 第二步 在web服务器中将域名与相应的网站绑定 但是 如果通过主机IP能直接访问某网站 那么把域名解析到这个IP也将能访问到该网站 而无需
  • Android项目封装一个登录页隐私协议弹窗工具包(一)

    Android项目封装一个登录页隐私协议弹窗工具包 一 在写andorid原生时 登录页面一般会显示用户注册服务协议和隐私政策协议 直接硬编码的话 感觉不太优雅 也不利于组件的移植 例如 所以想封装一个支持无限添加的各种协议的工具包 代码如
  • Java方法重载(Overload)

    方法重载 方法名相同 只是传入的参数个数不同 或者类型不同 或者不同类型不同顺序 此时调用方法时 只需要根据传入参数即可找到对应的那个方法 而不需要定义多个方法 eg sumtwo sumthree sumfour等 只用一个sum方法就行
  • 基于Redis+MySQL+MongoDB存储架构应用

    摘 要 Redis MySQL MongoDB技术架构实现了本项目中大数据存储和实时云计算的需求 使用MongoDB切片的水平动态添加 可在不中断平台业务系统的同时保障扩容后的查询速度和云计算效能 依据切片键索引分片 位于各切片独立进行计算
  • 上传文件异常问题 nginx报错 413 Request Entity Too Large

    nginx报错 413 Request Entity Too Large 一个上传文件的功能 内网测试都正常了 但是发布到外网就无法上传大点的 大于1MB 文件 更奇怪的是 后台还没有任何的异常信息 于是就用Http抓包工具 HttpDet
  • 【论文阅读】Error Bounds of Imitating Policies and Environments

    模仿策略和环境的误差边界 摘要 文章中对行为克隆和GAIL两种模仿方法进行对比 分析了 两种方法生成的模仿策略与专家策略之间的价值差距 得出了GAIL可以减少复合误差的结论 具有更好的样本复杂性 同时发现模仿学习也可以用于学习环境模型 相比
  • 常见的企业网络加速方案有哪些?

    企业网络加速方案通常指的是企业采取特定的技术和方法来提高网络的速度和性能 一些常用的企业网络加速方案包括 网络缓存 通过在网络中建立缓存机制 可以将常用的数据存储在本地 以提高网络的访问速度 网络压缩 通过对网络数据进行压缩 可以减少数据传
  • 福利!打造自己的ChatGPT聊天小程序,前后端代码全开源

    简介 本文分享一个我前几个月实现的一个智能聊天系统小项目 包含了java后端 微信小程序端 web页面端三个子工程 代码已经全部开源 地址放在了文末 最近一年 chatGPT的火爆程度 已经不需要我再多说了 但是依旧有很多人想用却用不上 原
  • elementUI的Table分页多选框

    目的 实现进入页面显示默认的选中项 在用户重新选择后 将选择的和取消选择的数据提交给后台 这里涉及到一个分页的问题 表格是可分页的表格 所以要存储用户的选项 1 element ui的table表格的多选框默认选中 data return
  • spring整合redisson配置

    配置方式 redis的部署方式有单节点部署 哨兵方式部署 集群方式部署3种方式 各种配置方式可以去看xsd文件 redisson 1 1 xsd
  • 【漏洞发现】xxe

    一 漏洞描述 XXE漏洞利用的是XML解析器处理XML文件时的一个特性 即可以引用外部实体 攻击者可以在XML文档中定义一个外部实体 并在引用该实体时 在外部实体中注入恶意代码或文件路径等敏感信息 当XML解析器解析文档时 会自动解析外部实
  • nginx-sticky-module的使用(基于cookie的会话保持)

    在多台后台服务器的环境下 我们为了确保一个客户只和一台服务器通信 我们势必使用长连接 使用什么方式来实现这种连接呢 常见的有使用nginx自带的ip hash来做 我想这绝对不是一个好的办法 如果前端是CDN 或者说一个局域网的客户同时访问
  • IDEA如何导入Eclipse项目-靠谱

    小伙伴在用到IDEA的时候 将已有的Eclipse项目导入到IDEA中 遇到各种问题 我总结了一下 仅供参考 我的工具版本是 IntelliJ IDEA 2017 1 5 1 open的项目目录展示 实际文件目录 打开的项目目录展示 2 点
  • Java High Level REST Client 中文API(仅供参考)

    1 初始化 兼容性 Java High Level REST Client需要Java 1 8 并依赖于Elasticsearch核心项目 客户端版本与客户端开发的Elasticsearch版本相同 它接受与TransportClient相
  • PyQt的动作(QAction)

    前言 Qt的设计师程序能够识别用户界面中用户做同样事情时所经常使用的不同种方法 例如 在许多应用中创建一个新文件可以使用File gt New菜单项 或者通过点击按钮图标 或者使用快捷键等 对于用户是如何执行动作的我们并不关心 关心他们到底
  • 第一章: Mysql体系结构和存储引擎

    文章目录 1 1 定义数据库和实例 1 2 Mysql体系结构 1 3 Mysql存储引擎 1 4 常见问题解答 1 5 存储引擎相关操作语法 1 6 连接Mysql 1 1 定义数据库和实例 数据库和实例的区别 数据库是物理操作系统或其他