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.mfbz.cn/a/764463.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VBA字典与数组第十六讲:行、列数不相同的数组间运算规律

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…

分布式链路追踪Micrometer Tracing和ZipKin基础入门与实践

【1】概述 在分布式与微服务场景下&#xff0c;我们需要解决如下问题&#xff1a; 在大规模分布式与微服务集群下&#xff0c;如何实时观测系统的整体调用链路情况。 在大规模分布式与微服务集群下&#xff0c;如何快速发现并定位到问题。 在大规模分布式与微服务集群下&…

供应商管理软件:企业挑选新供应商的5个考量

在选择新的供应商时&#xff0c;企业必须进行细致的考量&#xff0c;这一决策对于依赖外部商品的零售商尤为关键。一段成功的合作伙伴关系不仅能够促进销售增长&#xff0c;还能提供稳定的服务支持。相反&#xff0c;失败的合作伙伴关系可能会导致客户不满、利润损失&#xff0…

一篇搞懂!LinuxCentos中部署KVM虚拟化平台(文字+图片)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月28日15点11分 &#x1f004;️文章质量&#xff1a;94分 目录 ————前言———— KVM的优点 KVM…

机器人控制系列教程之Delta机器人运动学分析(2)

基于MATLAB的Delta机器人正向运动学模型求解 我们在上一篇推文 中&#xff0c;推导了Delta机器人的正向运动学&#xff0c;简单来说&#xff0c;就是我们可以通过机器人的末端位姿求解出对应的关节空间的角度&#xff08;位置&#xff09;。 最终我们分析该机器人的空间位置结…

服务器数据恢复—raid5阵列硬盘出现大量坏道的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台DELL EqualLogic PS 4000存储中有一组由12块磁盘组建的raid5阵列&#xff0c;存储空间划分3个同等大小的卷&#xff0c;采用的VMFS文件系统。 两块硬盘指示灯亮黄色&#xff0c;raid5阵列崩溃&#xff0c;存储变得不可用。 服…

C++类型转换可调用对象

目录 C的四种可视性类型转换 1.static_cast 2.reinterpret_cast 3.const_cast 4.dynamic_cast C中的可调用对象 普通函数 函数指针 仿函数 Lambda表达式 包装器function bind C的四种可视性类型转换 C语言中的类型转换是不安全、不明确的&#xff0c;于是C就出了更…

跨境业务经验推荐:三大优秀的IP代理服务商

作为一名多年从事跨境业务的老手&#xff0c;今天我要给大家介绍几款绝对靠谱的IP代理服务商&#xff0c;保证让你的全球业务更加顺畅&#xff01; 1. 711Proxy 711Proxy以其优秀的性能和覆盖范围广而著称。对于跨境电商和国际业务来说&#xff0c;快速稳定的网络连接至关重要…

115V 400HZ远机位电源车在国际机场的推广与应用

随着我国航空业的快速发展&#xff0c;对于远机位电源车的需求也越来越迫切。远机位电源车可以为飞机提供稳定、可靠的电力&#xff0c;确保飞机在停机、起降、航行等环节中正常运行。在当前的航空技术中&#xff0c;115V 400HZ 远机位电源车技术发展及其在航空领域的应用逐年增…

把 AI 人机炼成高玩,游戏 AI 技术实践指南,码住!

今天&#xff0c;为大家深入浅出地讲明白上亚运的经典 IP《梦三国 2》&#xff0c;到底应用了哪些来自网易数智的 AI 黑科技。看完你就会觉得&#xff1a;原来做 AI&#xff0c;我也行&#xff01; 方案概述 游戏作为 AI 落地最佳的试验田&#xff0c;近年来已经产生了多个极具…

计算机系统基础(二)

1.数值数据的表示 为什么采用二进制&#xff1f; 二进制只有两种基本状态&#xff0c;两个物理器件就可以表示0和1二进制的编码、技术、运算规则都很简单0和1与逻辑命题的真假对应&#xff0c;方便通过逻辑门电路实现算术运算 数值数据表示的三要素 进位记数制&#xff08;十…

计算机缺少d3dcompiler_43.dll无法继续执行代码怎么修复

打开游戏或许软件程序时候&#xff0c;我们会经常遇到各式各样的问题&#xff0c;比如找不到d3dcompiler_43.dll无法继续执行代码就是非常常见的问题&#xff0c;今天我叫大家如何解决遇到d3dcompiler_43.dll丢失问题&#xff0c;也详细介绍d3dcompiler_43.dll文件是什么与丢失…

加油卡APP开发,汽车加油省钱新模式

随着社会生活水平的提高&#xff0c;汽车已经成为了家家户户的出行工具&#xff0c;汽车加油也就成为了居民日常出行必不可少的开销。为了让居民享受到更加便利、优惠的加油体验&#xff0c;加油卡APP由此产生&#xff0c;不仅方便了用户&#xff0c;也给汽车加油市场提供了更加…

Qt常用技巧代码分享

写在前面:首先Qt主要是面向于界面设计,界面有些布局以及用法很多,可以不会写代码,但是要知道Qt可以实现这个功能,然后一点点去寻找学习,问AI也好,百度也好都可以,总比Qt可以实现某些布局功能,但是你不知道怎么去实现这些功能要好得多。俗话说的好,可以不会,但是不能…

跨境电商新趋势:海外盲盒小程序的市场机遇

随着全球经济的深度融合和消费者需求的日益多元化&#xff0c;跨境电商作为一种新型的国际贸易模式&#xff0c;正在以前所未有的速度发展。而在这一浪潮中&#xff0c;海外盲盒小程序凭借其独特的商业模式和强大的市场潜力&#xff0c;正逐渐成为跨境电商领域的新宠。本文将探…

双目摄像头测距

Opencv双目校正函数 stereoRectify 详解 参数说明&#xff1a; 输入参数&#xff1a; cameraMatrix1&#xff1a;左目相机内参矩阵 distCoeffs1&#xff1a;左目相机畸变参数 cameraMatrix2&#xff1a;右目相机内参矩阵 distCoeffs2&#xff1a;右目相机畸变参数 imageSize&…

检索增强生成RAG系列6--RAG提升之查询结构化(Query Construction)

在系列3文档处理中&#xff0c;我们着重讲解了文档解析&#xff0c;但是我们说的文档都是大部分是非结构化的文档或者说它就是以一个文档的形式存储。而现实中我们很多有价值的数据可能以结构化&#xff08;关系型数据库、图形数据库等&#xff09;或者半结构&#xff08;关系型…

基于X86+FPGA+AI的切割机控制、六轴机器人控制方案

一、智能设备控制 应用场景 智能制造(Intelligent Manufacturing, IM)是一种由智能机器和人类专家共同组成的人机一体化智能系统&#xff0c;它在制造过程中能进行智能活动&#xff0c;诸如分析、推理、判断、构思和决策等。通过人与智能机器的合作共事&#xff0c;去扩大、延…

从零到百万用户的扩展之路

写在前面: 此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/system/design-system 设计一个支持数百万用户的系统是极具挑战性的,它是一段需要持续优化和不断改进的旅程。在这篇博客中,我们将构建一个支持单个用…

开发数字药店APP实战:互联网医院系统源码详解

本篇文章&#xff0c;笔者将深入探讨如何开发一个功能完善的数字药店APP&#xff0c;并详细解析互联网医院系统的源码实现。 一、数字药店APP的需求分析 应具备以下基本功能&#xff1a; 用户注册与登录 药品搜索与浏览 在线下单与支付 订单管理 健康咨询与远程医疗 个人…