一零六九、MySQL回顾总结

2023-11-06

索引下推:在联合查询的过程中,根据联合索引包含字段直接过滤掉不满足的记录,减少回表次数(能用索引就用索引)
覆盖索引:查询字段包含了索引的全部字段
聚集索引:将常用的字段作为主键或聚集索引

undolog redolog binlog的区别和联系?
undolog(回滚日志):用来实现事务的原子性和MVCC
redolog(重做日志):用来实现事务的持久化操作,异步刷盘到磁盘
binlog(二进制日志):用来进行数据的备份和恢复,记录数据库所有的变更记录

mysql为什么采用树做索引?
Hash,树,跳表可以做索引,但Hash不支持范围查询,跳表不适合磁盘场景,所以选树来做索引

为什么选B+树做索引,而不是平衡二叉树,红黑树,B-树?
平衡二叉树追求绝对平衡,实现麻烦
红黑树多用于内容排序,在内存中去实现的,每个节点存放一个数据,树深度高,磁盘IO大
B-树 存 Key和data,B+树存放data,树深度大于B+树,效率没有B+树高

聚簇索引和二级索引的区别?
聚簇索引是主键索引,二级索引是非主键索引,都是基于B+树实现
在B+树上,通过这棵树可以找到全部的数据,这就是聚簇索引
二级索引叶子节点只存放索引、主键ID,而聚簇索引的叶子节点存放行数据,具体来讲,二级索引就是主键索引的索引

mysql锁分类?

  • 行锁和表锁
  • 共享锁和排他锁
  • 间隙锁和意向锁

InnoDB和MyIsAm有什么区别?

  • InnoDB支持事务,MyIsAm不支持
  • InnoDB支持行锁,MyIsAm支持表锁
  • InnoDB支持外键,MyIsAm不支持


数据库范式?
第一范式:每个属性都是原子性的,不可分割
第二范式:非主键完全依赖于主键
第三范式:非主键属性不依赖于其他非主键属性

反范式?
为了提高查询性能而在设计过程中有意引入冗余数据

 

事务隔离级别?分别解决了什么问题?
读未提交:读取到了还没提交的数据     解决脏读
读已提交:读取到其他事务提交的数据   解决不可重复读
可重复读:同一事务,读取同一条数据得到同样的结果     
串行化:事务排序,不可发生相互冲突,就是慢,没有什么问题   解决幻读

什么是脏读,脏写,幻读,不可重复读?

  • 脏读:A事务和B事务读取同一个数据,A事务回滚,B事务读取到的就是脏数据
  • 脏写:A事务和B事务写同一份数据,A事务回滚,B事务做的修改将会丢失
  • 幻读:A事务更新数据的过程中,B事务新添加了数据,导致A事务执行完还有剩余数据
  • 不可重复读:A事务读取同一个数据时,读取到了不同的数据

 

如何理解MVCC?
多版本并发控制,在多个事务同时读取和写入数据时保证数据的一致性和隔离性
版本号:每更新一条数据分配一个唯一的版本号,表示该数据的生命周期和有效期
多版本存储:对于读的操作,MVCC不会直接读取最新的数据,而是根据当前事务的时间戳和版本进行读取数据,
如果其他事务正在修改该数据,并且其版本号比当前事务早,则当前事务无法读取该数据,从而避免了不可重复读的问题。

 

索引越多越好吗?
不是,索引自身是需要占用物理内存空间的,索引越多,占用空间越大,经过DML操作,索引也会发生改变,也需要人力资源去维护

 

Mysql有哪几种索引类型?
普通索引:即一个索引只包含单个列,一个表可以有多个单列索引
唯一索引:索引列的值必须唯一,但允许有空值
联合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
主键索引:由主键组成的索引


什么是回表?如何减少回表次数?
在使用非聚集索引进行查询时,需要通过索引中的值再次去主键索引或聚集索引中查找对应的数据行的过程。
覆盖索引
聚集索引

索引失效场景?
!=
函数
运算符
or
模糊查询
not in、not exists

 

mysql索引一定遵循最左前缀匹配吗?
最左前缀匹配规则指的是,如果创建了一个由多个列组成的复合索引,查询时必须按照索引定义的顺序从左到右依次使用索引的列,
才能充分利用索引进行查找。也就是说,索引可以被用于匹配索引的第一个列(最左侧的列),或者是连续的前几个列。
如果查询中涉及到的列不满足最左前缀匹配规则,那么这个索引的使用将会受限或无法使用索引。

设计索引的时候有哪些原则?
选择适当的列作为索引
创建复合索引
考虑索引大小

SQL执行计划分析的时候要注意哪些信息?
type(索引类型),key(Mysql在当前查询时真正使用到的索引),extra(额外信息)

索引是什么?
一种数据结构,对于mysql的高效运行是很重要的,需要占用物理空间
采用B+树的数据结构,叶子节点存取数据,双向链表进行链接,可以大幅度提高查询效率


索引有哪些优缺点?
优点:大大加快数据的检索速度
缺点:时间方面,创建索引和维护索引需要耗费时间,对表进行增删改操作,索引需要动态的维护,会降低执行效率
空间方面,索引需要占用物理空间

最左前缀原则?
最左优先,在创建多列索引时,根据业务需求,where子句中使用最频繁的一列放最左边


为什么官方建议使用自增长主键作为索引?
自增长主键是连续的,减少页分裂

 

SQL约束有哪几种?

  • NOT NULL:用于控制字段的内容一定不能为空(NULL)。
  • UNIQUE:控件字段内容不能重复,一个表允许有多个 Unique 约束。
  • PRIMARY KEY:也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
  • FOREIGN KEY:用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
  • CHECK:用于控制字段的值范围。


Mysql char和varchar的区别?
char是定长字段,varchar是变长字段,效率上char大于varchar,定长属性尽量使用char

 

mysql 中 In和exists区别?
MySQL中的in语句是把外表和内表作hash连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。
not exists可以走索引,not in不走索引

事务的四个特征?
原子性:要么都做,要么都不做(undolog实现)
一致性:状态的改变必须是一个一致性状态到另一个一致性状态(事务数据日志实现)
隔离性:事务之间不能相互影响(MVCC实现)
持久化:更改后的永久性(redolog实现)

 

事务的实现原理?
基于undolog 和 redolog 实现的
undolog记录事务的增删改操作,主要用来解决事务提交错误进行回滚,反向操作
redolog记录数据页中的变更操作,将事务操作写入重做日志进行持久化(buffer pool-->刷盘)

 

mysql InnoDB在可重复读下完全解决幻读问题了吗?
没有,在快照读下通过MVCC解决了幻读问题,一直读取事务启动时的数据,即使中途有其他事务插入了数据也是读不到的,避免了幻读问题
在当前读下通过记录锁+间隙锁解决幻读,在这个间隙内插入的语句会被阻塞,无法插入,避免了幻读问题

mysql如何解决不可重复读?
通过MVCC解决,当数据被修改时,会生成新的版本号,保证了不同事务读取的是不同版本的数据,从而避免了重复读问题。
事务隔离级别

 

SQL调优有哪些办法?
1、避免使用select * ,而是具体的对应行
2、避免笛卡尔积,Join表不能过多
3、索引优化,使用适当的联合索引,覆盖索引
4、缓冲区大小,并发连接数
5、加入Redis缓存
6、主从复制,读写分离
7、通过explain分析SQL的执行计划,去适当的进行调整
数据量过大可以考虑 分库分表

Mysql执行流程
通过存储引擎连接Server层,命中索引直接返回给客户端,普通SQL语句进入分析器分析,然后优化器执行计划,执行器返回结果给客户端

 

mysql主从复制?
主服务器:
从服务器:复制主服务器的二进制文件执行,使用Binlog二进制日志来保证数据的一致性

 

InnoDB和MyISAM存储文件的结构有什么不同?
InnoDB使用聚集索引来组织数据,按照主键顺序存储在磁盘上,MyISAM采用堆表的形式,插入追加的方式
InnoDB使用B+树,MyISAM使用B树

 

从底层讲一下索引失效的情况?
没有遵循最左前缀匹配原则,保证最左相同的情况下,比较下一个字段才有意义

 

 limit如何优化?
添加索引
分页缓存,可以考虑在应用层实现分页缓存,缓存之前查询的结果
延迟加载

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

一零六九、MySQL回顾总结 的相关文章

  • 如何防止大型 MySQL 导入的连接超时

    在开发过程中 我们的本地 WAMP 服务器如何从测试服务器获取最新数据 即生成数据库转储 然后使用 source 命令上传该转储以加载 sql 文件 最近 在导入的最后 我们收到了有关 old 变量的错误 这些变量在更改之前存储了原始设置
  • 使用 Coldfusion 分页

    是否可以仅使用一个查询在 Coldfusion 中分页并显示页数 我的理解是 您显然可以使用一个查询进行分页 但您需要一个额外的查询来创建页面 这是为了计算结果总数 currentPage 1 resultsPerPage Offset i
  • 通过左连接实现精确分页

    我已经思考这个问题有一段时间了 我认为最好四处询问并听听其他人的想法 我正在构建一个在 Mysql 上存储位置的系统 每个位置都有一个类型 有些位置有多个地址 表格看起来像这样 location location id autoincrem
  • 如何解决 MySQL Workbench 上的这些行错误?

    正如您所看到的 我的代码中没有语法错误或类似的错误 你们能帮我吗 我想这只是错误标记机制中的一个小错误 尝试编辑代码或关闭此编辑器并打开一个新编辑器 如果您有重现此问题的步骤列表 您甚至可以创建一个错误报告 http bugs mysql
  • sqlalchemy 中的随机 ID(pylon)

    我正在使用 pylons 和 sqlalchemy 我想知道如何将一些随机 id 作为primary key 最好的方法是使用随机生成的 UUID import uuid id uuid uuid4 uuid 数据类型在某些数据库中本机可用
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • RESTful Web 服务:java.lang.NullPointerException service.AbstractFacade.findAll

    我使用 NetBeans 7 的 来自数据库的 RESTful Web 服务 向导创建了一个简单的 XML Web 服务 此时 我想从关联的 mySQL 数据库发布用户列表 当我尝试通过其 URL http localhost 8080 d
  • 哈希 MySQL 数据库架构

    我想对 MySQL 数据库模式 没有数据 进行哈希 签名 以便对其进行校验和 以确保它不被其他人修改 我怎样才能实现它 据我了解您的问题 您需要表校验和 checksum table table 所以 我想 只需对空表进行校验和
  • 哈希密码字段使用什么数据类型以及长度?

    我不确定密码哈希是如何工作的 稍后将实现 但现在需要创建数据库模式 我正在考虑将密码限制为 4 20 个字符 但据我了解 加密后哈希字符串的长度将有所不同 那么 如何将这些密码存储在数据库中呢 更新 仅使用哈希函数不足以存储密码 你应该阅读
  • MySQL LAST_INSERT_ID() 和 FOUND_ROWS()

    当 PHP 脚本每秒有数百个查询时会发生什么 它会影响这些函数吗 是否保证它们会返回当前脚本中最后一个插入语句中最后插入的 id 它会返回当前脚本中最后一次选择的行数吗 如果同时从另一个脚本进行新的插入或选择 在 FOUND ROWS 的情
  • 将 Python 列表(JSON 或其他)插入 MySQL 数据库

    所以我在Python中有一堆数组数据 嗯 相反 我有一个清单 我试图将此数组存储到 MySQL 数据库中的单个单元格中 我尝试使用 JSON 来序列化我的数据 但也许我不明白 JSON 是如何工作的 因此 在连接到我的数据库后 我尝试了上游
  • MySQL 查询中的窗口函数

    有没有办法在 SELECT 查询本身中动态地使用 MySQL 查询中的窗口函数 我知道在 PostgreSQL 中这是可能的 例如 下面是 PostgreSQL 中的等效查询 SELECT c server ip c client ip s
  • 如何查找所有mysql表之间的所有关系?

    如何找到MySQL所有表之间的所有关系 例如 如果我想知道大约有 100 个表的数据库中表的关系 有什么办法知道这个吗 从编程角度来说 更好的方法是从以下位置收集数据 INFORMATION SCHEMA KEY COLUMN USAGE表
  • 级联删除时触发调用

    我在 MySQL 中有表 A 它有一些对其他表 B C D 的级联删除的引用 当从 A 中删除某些内容时 我需要使用触发器 当我直接从 A 删除记录时 此触发器起作用 但它不适用于级联删除 是否存在任何版本的 MySQL 可以让我的触发器与
  • VIEW for 表结合 UNION ALL 的 MySQL 性能

    假设我有 2 张桌子MySQL create table persons id bigint unsigned not null auto increment first name varchar 64 surname varchar 64
  • 重用 PDO 语句 var 会使进程崩溃

    我重用一个变量来存储两个不同的 PDO mysql 语句 stmt dbh gt prepare SELECT stmt gt execute stmt dbh gt prepare UPDATE crash here Error in o
  • MySQL - 从另一个表插入与常量合并的数据

    我有一个包含一些数据的临时表 products temp 并且我有另一个需要将数据插入其中的表 产品 我需要在新记录上手动设置一些常量 例如vendor id 1等 是否可以在一次请求中插入临时表数据和常量 临时产品 product nam
  • 使用多个 WHERE 子句更新 Codeigniter 中的批次

    我查看了 CI 用户指南来了解如何处理update batch 并且它似乎只接受一个索引来匹配要更新的行 但在我的例子中 我需要指定两个索引 例如lang and id page我一起用作索引 这样的lang en id page 115是
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF

随机推荐

  • C # 学习笔记十

    引言 委托 和 事件在 Net Framework中的应用非常广泛 然而 较好地理解委托和事件对很多接触C 时间不长的人来说并不容易 它们就像是一道槛儿 过了这个槛的人 觉得真是太容易了 而没有过去的人每次见到委托和事件就觉得心里别 bi
  • github代码push

    情景 今天准备往github提交代码 但是发现一直443 解决方法 首先 科学上网 然后终端输入 git config global http https github com proxy socks5 127 0 0 1 7890 完事
  • 网络系列--计算机系统与人工智能之我见

    文章目录 计算机系统与人工智能之我见 for AI 硬件 XPU的发展 软件 AI编程框架 by AI AIOps 传统产业 AI 总结 参考文献 人工智能 AI 是当前的发展热点 从计算机系统的角度看 有两个角度 一是for AI 即何优
  • Google Chrome右上角搜索标签页(倒三角图标) 禁用方法

    无意间发现这个图标 以为是安装了流氓插件 没想到是浏览器自带的实验性功能 禁用方法 地址栏输入 chrome flags 搜索栏输入 Tab Search 把Default改为Disabled 重启浏览器即可 2021 6 6更新 突然又发
  • IDEA和VS code设置默认换行符为LF

    相信用Git的人对这个问题非常了解了 如果团队没做好约定 或者新人不太会用git 用的又是windows git又没有开启autocrlf 那么当队友修改了代码提交之后 那画面真的是不忍直视 所以索性将IDE的默认换行符设置为LF 一劳永逸
  • tf好朋友之matplotlib的使用——secondary axis次坐标轴的使用

    tf好朋友之matplotlib的使用 secondary axis次坐标轴的使用 次坐标轴显示的常用函数 plt subplots ax1 twinx 应用示例 坐标轴可以不止一边噢 除了左边还可以有右边 次坐标轴显示的常用函数 plt
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 2023浙江省赛“信息安全管理与评估“--数字取证调查--网络数据包分析解析(高职组)

    2022全国职业技能大赛 信息安全管理与评估 高职组 任务书 2022全国职业技能大赛 信息安全管理与评估 任务书 第一阶段竞赛项目试题 第二阶段竞赛项目试题 任务 2 网络数据包分析 第三阶段竞赛项目试题 2022全国职业技能大赛 信息安
  • iar 堆栈设置_Heap堆的理解以及在IAR中如何设置堆的大小

    堆栈的概念在脑海里已经存在有一段时间了 今天就测试来整理下Heap堆 栈以后再说 堆区不像全局变量和局部变量总是有指定的内存大小 它是为了在程序运行时动态分配内存而设定的一块区域 在程序运行时需要一块特定大小的内存空间来使用的时候 那么可以
  • spring获取DataSource数据源从Tomcat中配置的数据源获取方法--jndi方式

    1 配置目的 公司数据库提供内网与外网访问数据库 在家与公司都可以访问 这就需要分情况配置数据源信息 公司项目统一在tomcat中配置数据源信息 不同环境只需要更改tomcat数据源配置信息 不需要对项目配置信息进行修改 方便灵活 2 对于
  • uniapp 中使用 vue vite

    import defineConfig from vite import uni from dcloudio vite plugin uni export default defineConfig plugins uni server po
  • python requirements.txt的生成与使用

    项目开发过程中难免少不了三方库的各种安装 python对这个场景做了一个特别的三方包安装list 一般都叫做requirements txt 如果项目中使用了 virtualenv 环境 直接通过pip freeze 就可以解决 如果没有的
  • 测试开发必备10大技能,你达标了吗?

    一个人到底要走多少弯路 才能成为一名合格的测试开发工程师 近年来 随着敏捷开发 微服务架构 DevOps逐渐深入人心 软件行业发生了翻天覆地的变化 相应地 软件测试行业也洗牌加剧 软件测试的准入门槛 也从以前的是个人就行 逐渐变成了 科班出
  • 升级OpenSSH

    升级OpenSSH 安装工具包 yum install y gcc gcc c openssl devel zlib devel zlib dev openssl devel pam devel 备份旧的ssh文件 mkdir p back
  • 多进程IterableDataset流式读取数据的坑:每个进程会读取一遍完整数据

    构建流式读取DataLoader的方法可以参考 pytorch构造可迭代的DataLoader 动态流式读取数据源 不担心内存炸裂 pytorch Data学习三 使用如下方法构造DataLoader 如果num workers设置为N 就
  • kubernetes 1.27.3 集群部署方案

    一 准备环境 1 1 Kubernetes 1 27 3 版本集群部署环境准备 1 1 1 主机硬件配置说明 cpu 内存 硬盘 角色 主机名 系统版本 8C 8G 1024GB master master01 centos 7 9 8C
  • C++STL(5)常用容器介绍(四)list、set、map容器

    1 list 概 述 链表是一种物理存储单元上非连续 非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表由一系列结点 链表中每一个元素称为结点 组成 结点可以在运行时动态生成 每个结点包括两个部分 一个是存储数据元素
  • jenkins学习笔记第二篇全局工具配置与结点配置

    1 1jenkins 全局工具配置 maven配置 JDK配置 Ant配置 本地安装的有ANt1 9 配置ANt可以实现后面的 jmeter Ant的自动化接口测试 生成自动化测试报告 Git配置 在配置结点时 先配置全局安全性 Confi
  • php 请求chatgpt3.5 非stream流输出模式代码用于批量发布文章

    以下是模板兔用php写的请求chatgpt3 5 非流输出模式 不是打字特效 的代码示例 这种非流模式一般用于批量生产文章 通过chatgpt你可以大量生产伪原创文章 提供网站收录 近期我们会增加一个wordpress通过GPT批量发布文章
  • 一零六九、MySQL回顾总结

    索引下推 在联合查询的过程中 根据联合索引包含字段直接过滤掉不满足的记录 减少回表次数 能用索引就用索引 覆盖索引 查询字段包含了索引的全部字段聚集索引 将常用的字段作为主键或聚集索引 undolog redolog binlog的区别和联