MySQL-核心知识要点

1、索引的数据结构-B+tree

B+Tree的优势:

B+树的内节点无data,一个节点可以存储更多的K-V对。在构造树时,需要的内节点会更少,那么树的层级也会越低。查询一条数据时,1. 扫描的层级低,扫描过的节点更少,2. 过程更加稳定。
每一层的节点与相邻节点有指针相互连接(双向),数据可顺序逆序、跨页查找,对于范围查询更友好
B+Tree的缺点:内节点的K-V对会冗余,多占用空间。

B+树一般有两到三层,由于其高扇出,三层就能支持2kw以上的数据,且一次查询最多1~3次磁盘IO,性能也还行。

存储同样量级的数据,B树比B+树层级更高,因此磁盘IO也更多,所以B+树更适合成为mysql索引。


 

MySQL单表数据为何限制在千万级别,超过千万会有什么问题?

 

上面user表数据,在硬盘上其实也是类似,放在了user.ibd文件下。含义是user表的innodb data文件,又叫表空间

虽然在数据表里,它们看起来是挨在一起的。但实际上在user.ibd里他们被分成很多小份的数据页,每份大小16k。

类似于下面这样。

也就是说

同样一个16k的页,非叶子节点里每一条数据都指向一个新的页,而新的页有两种可能。

  • 如果是末级叶子节点的话,那么里面放的就是一行行record数据。
  • 如果是非叶子节点,那么就会循环继续指向新的数据页。

假设

  • 非叶子结点内指向其他内存页的指针数量为x
  • 叶子节点内能容纳的record数量为y
  • B+树的层数为z

那这棵B+树放的行数据总量等于 (x ^ (z-1)) * y。

x值计算:

非叶子节点里主要放索引查询相关的数据,放的是主键和指向页号。

主键假设是bigint(8Byte),而页号在源码里叫FIL_PAGE_OFFSET(4Byte),那么非叶子节点里的一条数据是12Byte左右。

整个数据页16k, 页头页尾那部分数据全加起来大概128Byte,加上页目录毛估占1k吧。那剩下的15k除以12Byte,等于1280,也就是可以指向x=1280页

我们常说的二叉树指的是一个结点可以发散出两个新的结点。m叉树一个节点能指向m个新的结点。这个指向新节点的操作就叫扇出(fanout)

而上面的B+树,它能指向1280个新的节点,恐怖如斯,可以说扇出非常高了。

y的计算:

叶子节点和非叶子节点的数据结构是一样的,所以也假设剩下15kb可以发挥。

叶子节点里放的是真正的行数据。假设一条行数据1kb,所以一页里能放y=15行

行总数计算

回到 (x ^ (z-1)) * y 这个公式。

已知x=1280,y=15。

假设B+树是两层,那z=2。则是(1280 ^ (2-1)) * 15 ≈ 2w

假设B+树是三层,那z=3。则是(1280 ^ (3-1)) * 15 ≈ 2.5kw

这个2.5kw,就是我们常说的单表建议最大行数2kw的由来。毕竟再加一层,数据就大得有点离谱了。三层数据页对应最多三次磁盘IO,也比较合理。

单页16K为何这样设计?

为了提高索引查询效率和降低磁盘I/O的频率,MySQL设置了16KB的单页大小。这是因为在MySQL中:

内存大小限制:MySQL的索引需要放在内存中进行查询,如果页面过大,将导致索引无法完全加载到内存中,从而影响查询效率。

磁盘I/O限制:当需要查询一个索引时,MySQL需要把相关的页面加载到内存中进行处理,如果页面过大,将增加磁盘I/O的开销,降低查询效率。

索引效率限制:在B+树数据结构中,每个叶子节点存储着一个索引条目,因此如果每个页面能够存放更多索引条目,就可以减少B+树结构的深度,从而提高索引查询效率。

综上所述,MySQL索引单页大小设置为16KB可以兼顾内存大小、磁盘I/O和索引查询效率等多方面因素,是一种比较优化的方案。需要注意的是,对于某些特殊的应用场景,可能需要根据实际情况对单页大小进行调整。

2、MVCC

MVCC,全称 Multi-Version Concurrency Control,即多版本并发控制

MVCC机制具有以下优点:

  • 提高并发性能:读操作不会阻塞写操作,写操作也不会阻塞读操作,有效地提高数据库的并发性能。
  • 降低死锁风险:由于无需使用显式锁来进行并发控制,MVCC可以降低死锁的风险。

MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。

参考:深入浅出:MVCC详解-CSDN博客

3、隔离级别

为了解决并发事务存在的脏读、不可重复读、幻读等问题,数据库设计了四种隔离级别。分别是读未提交,读已提交,可重复读,串行化(Serializable)。

1、读未提交

读未提交隔离级别,只限制了两个数据不能同时修改,但是修改数据的时候,即使事务未提交,都是可以被别的事务读取到的,这级别的事务隔离有脏读、重复读、幻读的问题;

2、读已提交

读已提交隔离级别,当前事务只能读取到其他事务提交的数据,所以这种事务的隔离级别解决了脏读问题,但还是会存在不可重复读、幻读问题;

3、可重复读

可重复读隔离级别,限制了读取数据的时候,不可以进行修改,所以解决了重复读的问题,但是读取范围数据的时候,是可以插入数据,所以还会存在幻读问题;

4、串行化

事务最高的隔离级别,在该级别下,所有事务都是进行串行化顺序执行的。可以避免脏读、不可重复读与幻读所有并发问题。但是这种事务隔离级别下,事务执行很耗性能。

幻读

幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样。

A 事务查询一个表,表里只有一条记录,id为1,但是这个时候 B 事务插入了一条数据,id为2,A 事务因为不知道有id为2的数据,所以这个时候A也插入了一条id为2的数据,这个时候肯定会插入失败.这种情况就是幻读。

4、ACID特性

ACID 是数据库事务的四个基本特性的首字母缩写,具体含义如下:

  1. 原子性(Atomicity)

    • 事务是数据库操作的最小单位,要么全部执行成功,要么全部失败回滚,不会出现部分执行的情况。这确保了数据库的一致性,即事务中的所有操作要么全部提交,要么全部取消。
  2. 一致性(Consistency)

    • 在事务开始和结束时,数据库的完整性约束没有被破坏。这意味着事务将使数据库从一个一致性状态转移到另一个一致性状态,不会导致数据的损坏或矛盾。
  3. 隔离性(Isolation)

    • 多个事务并发执行时,每个事务的操作应该互不干扰,即使是并发执行的情况下,每个事务看到的数据状态也应该是一致的。这通过各种并发控制技术来实现,例如锁机制、多版本并发控制等。
  4. 持久性(Durability)

    • 一旦事务提交成功,其对数据库的更改应该永久保存在数据库中,即使系统发生故障或崩溃,修改的数据也不应丢失。

这些特性确保了数据库在处理事务时能够保持数据的完整性、一致性和可靠性,是数据库系统设计中非常重要的概念。

5、MySQL性能优化

MySQL性能优化十个实用技巧_mysql 性能优化-CSDN博客

建立索引:

1、离散度大的字段;

2、小字段;

3、联合索引最左匹配原则;

4、索引覆盖提升查询效率;

5、经常修改的数据不适合建立索引;

7、可以在where及order by涉及的列上建立索引;

8、索引并非越多越好,最好不要超过5个;

9、索引字段不要使用函数,会造成索引失效;

6、聚簇索引跟非聚簇索引

聚簇索引和非聚簇索引是数据库索引的两种主要类型,它们在实现和性能上有所不同。

聚簇索引(Clustered Index)

  1. 定义

    • 聚簇索引是按照索引的顺序来组织表中的行数据的索引。换句话说,聚簇索引决定了数据在磁盘上的物理存储顺序。
  2. 特性

    • 数据行按照聚簇索引的顺序存储在磁盘上。
    • 每张表只能有一个聚簇索引。
    • 聚簇索引通常提供较快的数据访问速度,因为它们可以通过索引直接访问数据行,而不需要再次查找到数据行的物理位置。
  3. 适用场景

    • 经常用于频繁进行范围查找和排序操作的列。
    • 通常应用于主键列,因为主键是唯一的且非空的。

非聚簇索引(Non-clustered Index)

  1. 定义

    • 非聚簇索引中索引条目的逻辑顺序与实际数据行的物理存储顺序不同。
  2. 特性

    • 索引条目指向实际数据行的物理位置。
    • 一张表可以有多个非聚簇索引。
    • 非聚簇索引的叶子节点保存索引字段的值和指向数据行的指针。
  3. 适用场景

    • 适合用于频繁进行查询但不一定是范围查询的列。
    • 通常应用于非唯一、允许空值的列。

性能比较

  • 查询性能

    • 聚簇索引通常比非聚簇索引更快,因为它们直接定位到数据行而无需再次查找。
  • 插入和更新性能

    • 非聚簇索引相对更好,因为插入新行时不需要重新排列数据行的物理存储顺序。
  • 空间利用

    • 非聚簇索引占用的空间通常比聚簇索引少,因为它们不需要在索引中包含整个数据行。

综合考虑

选择使用聚簇索引还是非聚簇索引取决于具体的数据库设计和查询模式。在大多数情况下,合理的索引设计是混合使用聚簇索引和非聚簇索引,以最大化查询性能和整体数据库性能。

总结

  • 查询性能方面,聚簇索引通常更快。
  • 插入和更新性能方面,非聚簇索引可能更有优势。
  • 具体应用需要根据具体情况进行综合考虑,灵活设计索引以优化性能。

7、explain 执行计划

type                                       

表示MySQL在表中找到所需行的方式,又称“访问类型”,常见类型如下:

 ALL, index,  range, ref, eq_ref, const, system, NULL

从左到右,性能从最差到最好

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

EXPLAIN 执行计划命令详解-CSDN博客

8、show full process list 及 kill pid

在 MySQL 中,可以通过 SHOW FULL PROCESSLIST; 命令查看当前所有活动的数据库连接和运行的查询。而 KILL <pid>; 命令则用于终止指定的数据库连接或查询进程。

1. SHOW FULL PROCESSLIST;

这条命令用于显示当前 MySQL 服务器上所有活动的连接和它们执行的查询。返回的结果通常包括以下列:

  • Id:连接的唯一标识符。
  • User:连接的用户名。
  • Host:连接的主机名。
  • db:当前连接在使用的数据库(如果有的话)。
  • Command:连接当前正在执行的 SQL 命令。
  • Time:连接执行当前命令的时间(以秒为单位)。
  • State:连接的当前状态(例如正在执行查询、正在锁等待等)。
  • Info:连接当前正在执行的 SQL 语句。

使用场景

  • 监控数据库活动:可以帮助了解哪些连接正在执行哪些查询,以及这些查询的执行时间和状态。
  • 识别长时间运行的查询:可以用来发现执行时间过长或者被长时间阻塞的查询,从而进行优化或解决问题。
  • 查找占用资源过多的连接:可以用来识别消耗大量资源或者不必要占用连接池的连接,及时释放资源或终止连接。

2. KILL <pid>;

这条命令用于终止指定连接的数据库会话或者一个正在执行的查询进程。

用法

  • <pid> 是要终止的连接的 Id,可以通过 SHOW FULL PROCESSLIST; 查看。

注意事项

  • 权限:执行 KILL 命令需要 PROCESS 权限。
  • 影响:终止连接或查询可能会导致客户端程序出现错误,因此应谨慎使用。
  • 可能的后果:对于长时间运行的查询,特别是在 InnoDB 存储引擎下,可能会回滚正在进行的事务,这可能会导致数据丢失或不一致性。

何时使用 KILL 命令

  • 长时间运行的查询:如果一个查询正在占用数据库资源并且执行时间过长,可以考虑终止该查询,以释放资源并减少数据库负载。
  • 错误处理:当某个连接执行了错误的查询或者导致数据库性能下降时,可以通过 KILL 命令来中止这些操作,以恢复数据库的正常运行。

总结

SHOW FULL PROCESSLIST;KILL <pid>; 是 MySQL 中管理和监视数据库连接和查询的重要工具。合理使用这些命令可以帮助你识别和解决数据库性能问题,确保数据库运行平稳和安全。在使用 KILL 命令时,务必确保明确目标并了解可能的影响,避免误操作导致数据丢失或不一致。

9、索引覆盖跟回表查询

索引覆盖和回表查询都是与数据库查询性能优化相关的概念,它们通常与索引的使用方式和查询的执行计划有关。

索引覆盖(Index Covering)

索引覆盖是指一个查询可以完全通过索引来获取所需的数据,而不需要访问实际的数据行。具体来说,当一个查询的列在查询条件或者返回结果中都涵盖了索引的所有列时,我们称之为索引覆盖。

优势

  • 减少了对实际数据行的访问,从而减少了磁盘 I/O 操作。
  • 提升了查询性能,因为只需操作索引数据结构而无需读取实际数据行。

示例: 假设有一张表 users,有索引 (last_name, first_name, age)。如果一个查询 SELECT last_name, first_name FROM users WHERE last_name = 'Smith';,则可以直接利用 (last_name, first_name) 的索引来完成查询,而不需要回到实际的数据行中去获取 age 字段。

回表查询(Index Lookup)

回表查询是指当数据库引擎利用索引定位到数据行后,仍然需要进一步访问数据页(即磁盘上的实际数据行)来获取完整的数据。这种情况通常发生在查询中需要获取的列不全在索引中,或者查询中包含的条件无法完全由索引覆盖。

特点

  • 虽然索引可以加速数据行的定位,但最终还是需要访问数据页来获取完整的数据。
  • 如果回表次数过多,会增加额外的 I/O 操作,影响查询性能。

示例: 假设有一张表 orders,有一个索引 (order_id)。如果执行查询 SELECT order_id, customer_id FROM orders WHERE order_id = 123;,数据库引擎首先可以利用 (order_id) 索引定位到相应的行,然后需要回表获取 customer_id 字段的值,因为 customer_id 不在索引中。

总结

  • 索引覆盖:查询可以完全通过索引获取需要的数据,无需额外访问实际数据行。
  • 回表查询:索引定位到数据行后,仍需进一步访问实际数据行获取完整数据。

在实际的数据库设计和查询优化中,尽量通过合适的索引设计和查询调整,最大化利用索引覆盖,从而提升查询性能和减少系统资源的消耗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【netty系列-04】反应堆模式的种类和具体实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

数字化转型中,数字化如何重塑中小企业发展力?

引言&#xff1a;当前&#xff0c;我国中小微企业数字化转型处于“不平衡、不充分、不规范”阶段&#xff0c;普遍面临“不会转”“不能转”“不敢转”的困境。数字化转型可以帮助企业突破这些困境&#xff0c;实现更大的发展。更进一步&#xff0c;数字化转型是中小企业高质量…

学习笔记——动态路由——IS-IS中间系统到中间系统(基本概念)

二、IS-IS基本概念 1、IS-IS概述 IS-IS是ISO定义的OSI协议栈中的无连接网络服务(ConnectionLess Network Service&#xff0c;CLNS)的一部分&#xff0c;IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似&#xff0c;例如&#xff0c;运行IS-IS协议的直…

4.BeanFactory

可以看出BeanFactory表面上只有getBean相关的方法。 实际上控制反转、基本的依赖注入、Bean的生命周期的各种功能&#xff0c;都是由BeanFactory的实现类来实现的。&#xff08;DefaultListableBeanFactory&#xff09; DefaultListableBeanFactory管理单例对象DefaultSinglet…

杨万里,诚斋体的开创者

杨万里&#xff0c;字廷秀&#xff0c;号诚斋&#xff0c;生于南宋绍兴元年&#xff08;公元1127年&#xff09;&#xff0c;卒于南宋庆元二年&#xff08;公元1206年&#xff09;&#xff0c;享年79岁。在中国古代文学的璀璨星河中&#xff0c;南宋诗人杨万里以其清新脱俗、贴…

Android- Framework 非Root权限实现修改hosts

一、背景 修改system/etc/hosts&#xff0c;需要具备root权限&#xff0c;而且remount后&#xff0c;才能修改&#xff0c;本文介绍非root状态下修改system/etc/hosts方案。 环境&#xff1a;高通 Android 13 二、方案 非root&#xff0c;system/etc/hosts只有只读权限&…

机器学习python实践——关于管道模型Pipeline和网格搜索GridSearchCV的一些个人思考

最近在利用python跟着指导书进行机器学习的实践&#xff0c;在实践中使用到了Pipeline类方法和GridSearchCV类方法&#xff0c;并且使用过程中发现了一些问题&#xff0c;所以本文主要想记录并分享一下个人对于这两种类方法的思考&#xff0c;如果有误&#xff0c;请见谅&#…

【微服务】微服务之Feign 与 Ribbon

文章目录 强烈推荐引言优点Feign示例什么是Ribbon&#xff1f;Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件&#xff08;application.yml&#xff09;说明&#xff1a; Feign 与 Ribbon 结合使用的应用场景1. 动态服…

物联网的技术和应用有哪些?

随着科技的飞速发展&#xff0c;物联网已经成为连接世界的重要纽带&#xff0c;塑造着我们未来的生活。我们一起深入探索物联网的前沿技术和前瞻性应用&#xff0c;一窥未来的可能性。 获取物联网解决方案&#xff0c;YesPMP平台一站式物联网开发服务。 提示&#xff1a;智慧家…

图形的搭建

例一&#xff1a; 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 输出描述&#xff1a; 针对每行输入&#xff0c;输出用“*”组成的X形图案。 示例一&…

爬数据是什么意思?

爬数据的意思是&#xff1a;通过网络爬虫程序来获取需要的网站上的内容信息&#xff0c;比如文字、视频、图片等数据。网络爬虫&#xff08;网页蜘蛛&#xff09;是一种按照一定的规则&#xff0c;自动的抓取万维网信息的程序或者脚本。 学习一些爬数据的知识有什么用呢&#x…

IPIDEA代理IP助力高效数据采集

IPIDEA代理IP助力高效数据采集 文章目录 IPIDEA代理IP助力高效数据采集&#x1f4d1;前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 选择代理IP的关键因素 三、IPIDEA海外IP代理的优势3.1 IPIDEA的显著优势3.2 IPIDEA的代理类型及应用 四、IPIDEA爬虫实战4…

Fragment+Viewpage2+FragmentStateAdapter实现滑动式标签布局

大家好&#xff0c;我是网创有方&#xff0c;今天记录下标签布局的实现方法&#xff0c;先看下效果图。 第一步&#xff1a;编写一个activity或者fragment。内含有一个viewpager2的适配器&#xff0c;适配器类型为FragmentStateAdapter。 ​ public class MediaCreateFragment…

VideoView视频组件

简介 VideoView 在Android中是一个用户界面组件&#xff0c;它允许开发者在Android设备的屏幕上播放视频文件。它是Android SDK的一部分&#xff0c;位于android.widget包中。VideoView提供了一种简单的方法来嵌入和控制视频播放&#xff0c;包括设置视频源、开始、暂停、 seek…

CV每日论文--2024.6.27

1、Text-Animator: Controllable Visual Text Video Generation 中文标题&#xff1a;Text-Animator&#xff1a;可控视觉文本视频生成 简介&#xff1a;视频生成是各行业中具有重要价值但同时也极具挑战性的任务,例如在游戏、电子商务和广告领域。在文本到视频(T2V)生成中,一…

前端Bug 修复手册

1.前端长整数精度丢失问题 &#xff08;1&#xff09;问题 在前后端联调时&#xff0c;发现后端有一个接口返回的值和前端页面上展示的值不一致。 后端Java实现的接口如下&#xff0c;返回一个json格式的大整数 123456789123456789&#xff1a; 但是前端请求这个接口后&…

Spring每日面试题(day1)

目录 JavaWeb三大组件依赖注入的方式Autowire和Resurce有什么区别&#xff1f;Spring Boot的优点Spring IoC是什么&#xff1f;说说Spring Aop的优点Component和Bean的区别自定义注解时使用的RetentionPolicy枚举类有哪些值&#xff1f;Spring Boot自动装配原理Spring MVC工作原…

Charles抓包工具系列文章(三)-- 接口映射工具(Map Remote和Map Local)

一、背景 前文的http请求都是静态的&#xff0c;像compose a new request&#xff0c;仅适用于接口的自测。 回放repeat 一个 http 请求&#xff0c;也无法做到动态调试。 这里的动态还是静态&#xff0c;是站在客户端的角度&#xff0c;数据是实时的&#xff0c;可调试的。 …

提升入住率|智慧酒店解决方案,打造有温度的居住体验!

近年来&#xff0c;智慧酒店被越来越多的人关注&#xff0c;由生物识别、物联网技术和互联网技术融合产生的智慧酒店解决方案&#xff0c;不仅可以提升顾客在酒店的入住体验&#xff0c;还可以帮助酒店降低运营成本&#xff0c;这也让越来越的酒店选择了智慧酒店的赛道&#xf…

人工智能--目标检测

欢迎来到 Papicatch的博客 文章目录 &#x1f349;引言 &#x1f349;概述 &#x1f348;目标检测的主要流程通常包括以下几个步骤 &#x1f34d;数据采集 &#x1f34d;数据预处理 &#x1f34d;特征提取 &#x1f34d;目标定位 &#x1f34d;目标分类 &#x1f348;…