Mysql复习总结

2023-11-08

数据库特性

  • 原子性
  • 一致性
  • 隔离性
  • 持久性
原子性

所谓原子性就是事务的执行,要么全部成功,要么全部失败。

一致性

事务操作的完整性约束不会破坏,是原子性的一种表现,例如A向B转账,不会发生A金额发生变化,但是B金额不会发生变化的情况

隔离性

事务之间的操作是互相隔离的,且不受彼此的影响

持久性

事务完成后,所有数据保存在数据库中,持久存在,且不能回滚。

Mysql事务所存在的问题

  • 脏读 (Select没有规矩)

事务A插入了一条数据,但是还没有提交,结果事务B去读取数据表,发现了数据A要插入的数据,就是脏读

  • 不可重复读 (Update没有规矩)

事务A首次读某条数据为a,但是事务b此时更新了该条数据为b,结果A再次读取这条数据的时候就变成了b,就是不可重复读

  • 幻读 (insert,delete没有规矩)

事务A读取了数据表,事务B又插入了几条数据,当事务A再次读取数据表的时候,发现数据多了几条,就是幻读

数据库隔离级别

  • 未提交读

事务之间可以读取到事务未提交的数据 (完美的符合了上面出现的所有问题)

  • 提交读

事务必须提交之后,提交的数据才可以被其它的事务所看到。

  • 可重复读

悲观锁读,若一个事务A读取该条数据,那么不管其它的事务如何去更改这条数据,那么事务A依然读取到的是第一次读取到的数据。

  • 串行化

事务操作一个一个按照顺序来,慢是最大的问题

Mysql中的log

  • bin log

记录数据库的变更操作,例如delete,insert,update等操作,不会记录select,用于数据的恢复和复制,
记录形式为 一些sql语句还有一些事务id等内容

  • redo log

数据的读取或者说是修改操作,是先找到页,再读到内存,如果发生修改,读到内存后,还没来得及刷到磁盘,数据库gg了,那么数据容易丢失,但是redo log会记录页的变更内容,那么恢复数据库的话,就不会丢失数据了。

  • undo log

和redo log相反,在读到内存的时候,undo log还会记录相反的内容,比如redo是insert那么undo就是要记录delete的操作,记录的和binlog一样,属于逻辑变化

bin log VS redo log
  • binlog记录的是sql的语句等内容,redolog记录的则是XX页在XX行改了XX数据
  • binlog存在于所有的数据库系统,redo则是innodb的独家内容
  • redolog 和 binlog 必须数据都一致才算是正常,要不然都会回滚

MVCC

多版本并发控制,其实就是为每一条数据都填设一个版本号,因此提交读和重复读所读取的数据都是其中的快照读的一种

ACID如何被保证的

  • 原子性如何保证

如果事务失败则使用undolog进行会滚

  • 隔离性如何保证

MVCC,即多版本并发控制(Multi Version Concurrency Control),一个行记录数据有多个版本对快照数据。 => 也就是快照读

  • 持久性如何保证

redolog用于保证其持久性

存储引擎 (Innodb 和 MyISAM)

  • InnoDB支持事务,但是MyISAM不支持事务
  • InnoDB支持外键,但是MyISAM不支持外键
  • InnoDB是行级锁,但是MyISAM是表级锁
  • InnoDB是聚集索引(数据文件和索引是绑定的,也就是说,先查到索引,之后才可以查到数据),但是MyISAM是非聚集索引(也就是说数据和索引是相互分开的,索引直接链接着数据的地址)
    (换句话说:InnoDB下,索引就真的是索引,辅助索引则是数据的指针;但是MyISAM的主索引和辅助索引则都是数据指针)
  • InnoDB不支持全文搜索,但是MyISAM则支持全文搜索 (!mysql5.7之后innoDB也是可以支持全文搜索的)
  • 面试考的比较少了,但是可以看看
    • InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描,而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可
    • MyISAM表格可以被压缩后进行查询操作

InnoDB的自适应hash算法((Adaptive Hash Index, AHI))

InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引
InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引

InnoDB为什么推荐使用自增ID作为主键?

自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。

数据结构 - 查找树,红黑树,b树和b+树

查找树是不平衡的,举个例子来说,如果是插入(1,2,3,4,5),那么数据查找在查找树中会全部在一边,构成一个链表
红黑树是平衡的,但是红黑树是一颗二叉树,深度问题还是没有解决
b树在一定程度上其实已经解决了前两个的问题,简单的说就是:多叉的平衡树;但是b+树需要指定叶子节点的最大值,因此是无法也不能更好的始应数据库的需求
b+树是b树的升级版,b+树的非叶子节点只存储数据索引,且从左向右也是从小到大的排列,这样就可以更多的让索引存储,之后在叶子节点才是真正的数据部分,且每个叶子节点的最后会是指针指向旁边的叶子节点

索引

索引类型
  • 普通索引

就是最基本的添加一个索引,用于加速查找

  • 唯一索引

列值必须唯一,可以为空值,加速查找

  • 主键索引

利用主键作为索引,而且不可以为空,加速查找

  • 覆盖索引

就是查查找的数据也是索引值

  • 组合索引

几列合并成一个索引,但是遵循最左原则

  • 全文索引

全文分词查找,innoDB是做不到的,需要第三方,比如es等

索引带来的问题

使用索引的时候不可以随便使用,过度的使用索引会导致消耗大量的资源,热点核心业务的数据应该多使用索引
索引会浪费磁盘空间,不要创建非必要的索引,插入、更新、删除需要维护索引,带来额外的开销,索引过多,修改表的时候重构索引性能差
但是索引使用的时候可以减少查询次数,提高效率

查询的顺序

  1. from 从哪个表查询
  2. where 初步过滤条件
  3. group by 过滤后进行分组[重点]
  4. having 对分组后的数据进行二次过滤[重点]
  5. select 查看哪些结果字段
  6. order by 按照怎样的顺序进行排序返回[重点]

数据库设计三范式

  1. 1NF : 原子性 字段不可再分,否则就不是关系数据库
  2. 2NF : 唯一性 每一个主键是唯一的
  3. 3NF : 要求一个数据库表中不包含已在其他表中已包含的非主关键字信息, 例如 存在一个课程表,课程表中有课程号(Cno),课程名(Cname),学分(Ccredit),那么在学生信息表中就没必要再把课程名,学分再存储到学生表中,这样会造成数据的冗余

参考文章链接

  • InnoDB与MyISAM https://blog.csdn.net/qq_35642036/article/details/82820178
  • 敖丙 https://mp.weixin.qq.com/s/Lx4TNPLQzYaknR7D3gmOmQ
  • 三范式 https://blog.csdn.net/qq_43079376/article/details/93647335
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql复习总结 的相关文章

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

    我有两张桌子 TRIPS tripID clientID and LEGS legID depart arrive tripID TRIPS 与 LEGS 具有一对多关系 因为有多个legID s per tripID 我需要以以下格式显示
  • 使用另一个表中的数据查找并替换 MySQL 中的字符串

    我有两个 MySQL 表 我想使用另一个表中的数据查找和替换一个表中的文本字符串 Table texts messages thx guys i think u r great thx again u rock Table dictiona
  • SQL:比较不同表中的两个计数

    我有 3 张桌子 一张桌子上有世界上每个国家及其代币 NAME CODE Afghanistan AFG Albania AL Algeria DZ American Samoa AMSA Andorra AND Angola ANG An
  • 为什么 sql 字段名称中不应该包含逗号?

    人们一直告诉我列名中不应包含空格 我只是想知道 这是为什么 这是我为学校创建的一些数据库表遇到的问题 字段名称包括 Preble 和 Darke 相反 它们需要是 普雷布尔县 俄亥俄州 和 达克县 俄亥俄州 如果它们是行名称 我只需创建一个
  • 使用 pip3 安装 mysqlclient 时遇到问题

    我正在尝试使用 Django 设置 python 3 6 环境 安装说明说我应该安装 mysqlclient 才能连接到 mySQL 我明白了 dennis django sudo H pip3 install mysqlclient Co
  • 按 MAX(time) WHERE time <= x 选择最近的 MySQL 行

    我正在选择 MySQL 表的最新条目 SELECT MAX time as most recent userID FROM TableName GROUP BY userID ORDER BY most recent DESC 我的问题是
  • 为 Mariadb 安装连接器 C

    所以 我想使用 Mariadb 有一个连接器 C https downloads mariadb org connector c https downloads mariadb org connector c 我该如何安装它 坦白说 它的文
  • Rails 多租户架构,限制多个租户的访问范围

    目前我们有一个单租户数据库架构 MySQL 运行着超过 100 个数据库 我们使用 Apartment gem 切换子域上的数据库连接 一切都很顺利 然而 我们现在需要创建所谓的 伞 客户端 它可以访问一组现有客户端的所有数据 我不认为这对
  • PHP 中的异步数据库/服务调用:Gearman 与 pthreads

    在我们的 LAMP 站点上 我们遇到一些服务必须多次调用数据库才能提取数据的问题 通常在 PHP 中完成此操作的方式 至少我的经验 是串行的 这显然是低效的 我们可以通过使用缓存和聚合一些查询来缓解一些低效率的问题 但在某些情况下我们仍然需
  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • 自动将所有mysql表转储到单独的文件中?

    我想将每个 mysql 表转储到单独的文件中 手册指出其语法是 mysqldump options db name tbl name 这表明您事先知道表名称 我现在可以设置知道每个表名称的脚本 但是假设我在路上添加了一个新表并且忘记更新转储
  • MySQL 子查询返回多行

    我正在执行这个查询 SELECT voterfile county Name voterfile precienct PREC ID voterfile precienct Name COUNT SELECT voterfile voter
  • PDO fetch() 失败时会抛出异常吗?

    有没有方法PDO语句 fetch http php net manual en pdostatement fetch php如果 PDO 错误报告系统设置为抛出异常 则在失败时抛出异常 例如 如果我设置 PDO ATTR ERRMODE g
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • 如何将 php Web 应用程序转换为桌面应用程序并保留数据库 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们有一个用 PHP 开发的 Web 应用程序 但大多数客户并没有一直连接到互联网 那么 有没有办法将应用程序转换为桌面应用程序 以便
  • 本地数据库缓存的最佳实践?

    我正在开发一个应用程序 该应用程序的部分内容依赖于 MySQL 数据库 在某些情况下 应用程序将在互联网连接 UMTS 有限的环境中运行 特别是延迟较高的环境 应用程序的用户能够登录 并且应用程序用户界面的大部分内容都是从 MySQL 数据
  • 基本表创建 fpdf

    我找不到使用 fpdf 制作表格并从 mysql 数据库获取数据的合适教程 我只是想知道如何创建一个 我在网上尝试示例时遇到了很多错误 例如 我有 名字 中间名 姓氏 年龄 和 电子邮件 列 如何使用 fpdf 创建表格并回显数据库中的条目
  • Laravel Sum 列数据库 Eloquent

    尝试获取我的一个表中 int 字段的总和应该非常容易 不幸的是 事实并非如此 因为无论我使用 Laravel MySQL 还是 Excel 我都会得到不同的结果 Laravel 5 4 给了我20506 Table sum field na
  • 如何使用 PHP 从 MySQL 检索特定值?

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

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe

随机推荐

  • RevitAPI: Revit中求两条直线的夹角XYZ.AngleTo

    有时候我们并不知道一个函数可能会有什么行为 例如XYZ AngleTo的返回值是0 2 还是0 又找不到对应的文档 那就干脆自己动手测试一下了 代码如下 Line line1 Line CreateBound new XYZ 0 0 0 n
  • 浏览器适配Viewport 布局

    目标 使用postcss px to viewport将px单位自动转化为w h单位 安装 npm install postcss px to viewport 配置文件 根目录下新建postcss config js 复制下面代码 mod
  • QDU 算法考试复习

    第一章 算法概述 主定理 算法满足4条性质 1 输入 有零个或多个由外部提供的量作为算法的输入 2 输出 至少一个量作为输出 3 确定性 每条指令是清晰的 无歧义的 4 有限性 每条指令的执行次数是有限的 执行时间也是有限的 算法与程序的区
  • 发现【Stable-Diffusion WEBUI】的插件:不健康内容过滤器

    文章目录 零 前言 一 不健康内容过滤器 NSFW Sensor 零 前言 本篇主要提到了WEBUI的不健康内容过滤插件 它宁可错杀一千也不放过一个 可以有效避免有害内容 更多不断丰富的内容参考 继续Stable Diffusion WEB
  • odoo12从零开始:一、安装odoo运行环境(windows10)

    前言 鉴于好多朋友说没有mac电脑 windows开发其实也差不了多远 只是个人习惯问题 而且吧 windows的电脑其实配环境也挺快的其实 我在这里再稍微补一个比较简单的windows环境部署 希望可以对朋友们有一些帮助 在windows
  • 运算放大器积分电路及积分电路设计

    运算放大器积分电路及积分电路设计 积分电路 Integrator circuit 在运算放大器积分器电路中 电容器插入反馈环路中 并在反相输入端与R1一起产生一个RC时间常数 积分的物理意义 积分的物理意义我们经常会使用到 例如下面的几个例
  • 交叉编译Cubietruck的u-boot

    1 下载u boot源码 mkdir cubietruck cd cubietruck git clone https github com linux sunxi u boot sunxi git
  • CSS基础之动画

    动画 1 过渡 需要结合鼠标 动画 网页只要运行动画就可以立即生效 创建动画的方式 1 方式一 from 起点 to 终点 keyframes 动画的名字 from to 2 方式二 keyframes 动画的名字 0 100 如果一个元素
  • ICPC Latin American Regional – 2017 Jumping Frog

    Pog the Frog wants to compete in the World Frog Jump competition which will take place in Nlogonia In the competition ea
  • 前端代码规范

    9个前端代码规范秘籍 让你也能写出诗一样的代码 9个秘籍里边有6个文档 1本书和2个工具 如果你耐心看完 一定会提升代码质量 让你写出漂亮的代码 第一个秘籍 京东凹凸实验室前端代码规范 网址是 https guide aotu io 如果你
  • CTFHub技能树 Web-SQL注入 详解

    目录 整数型注入 字符型注入 报错注入 布尔盲注 时间盲注 MySQL结构 Cookie注入 UA注入 Refer注入 过滤空格 整数型注入 我们输入 1 不断尝试发现闭合方式就是 1 整数型 存在两列 order by 2 存在两个注入点
  • JBOSS4.2.2 Spring2.0.8 web中调用EJB异常

    从容器外能够正常调用EJB 但是web 应用中spring bean调用EJB出现下面异常
  • 深度学习分类基础概念对ACC、PPV、TPR、TNR

    举个例子 ACC 10 15 20 10 1 2 3 14 4 5 6 20 PPV 猫 10 10 1 2 解释 这里的1和2是因为狗 猪分类错误 分到了猫 PPV 狗 15 15 3 4 PPV 猪 20 20 5 6 TPR 猫 10
  • UDP与TCP报头介绍,三次握手与四次挥手详谈

    先介绍我们UDP TCP协议缓冲区 在UDP和TCP在数据传输和介绍时有有缓冲区概念的 UDP缓冲区 UDP没有真正意义上的 发送缓冲区 调用sendto会直接交给内核 由内核将数据传给网络层协议进行后 续的传输动作 UDP具有接收缓冲区
  • Python—retrying模块的使用

    使用超时参数能够加快我们整体的运行速度 但是在普通的生活中当我们使用浏览器访问网页时 如果发生速度很慢的情况 我们会做的选择是刷新页面 那么在代码中 我们是否也可以刷新请求呢 对应的 retrying模块就可以帮助我们解决 1 retryi
  • Quality Center设置开发人员修改bug状态

    使用QC时遇到了一个问题 将开发人员分配到QC默认的Developer的组中后 开发人员不能修改bug的状态 提示无权限操作 经查看原来是QC默认的Developer组对bug的权限没有 新建 gt 打开 这一操作 只有Project Ma
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据

    系列文章 python网络爬虫专栏 目录 序言 本节学习目标 特别申明 4 7 使用BeautfulSoup解析h
  • Idea项目爆红

    解决办法 方案一 重新加载Maven依赖 方案二 清除缓存 方案三 在当前项目下执行以下命令 重新生成 iml文件 mvn idea module
  • 利用java制作桌面应用程序_Java桌面应用

    对于作Java桌面应用来说 比较烦人的就是安装部署问题 客户端是否安装有jre jre版本问题 jre去哪下载 如 何用jre启动你的Java应 用 不要说刚接触电脑的人 就算是比较熟悉电脑 如果没有接触过Java 面对一个Java应用 如
  • Mysql复习总结

    目录标题 数据库特性 原子性 一致性 隔离性 持久性 Mysql事务所存在的问题 数据库隔离级别 Mysql中的log bin log VS redo log MVCC ACID如何被保证的 存储引擎 Innodb 和 MyISAM Inn