当前位置: 首页 > news >正文

【MySQL 进阶之路】了解 性能优化 与 设计原则

1.B+树的优势

“矮胖”结构

  • :B+树的每个节点存储更多的关键字,从而减少了树的层级(最多三层),减少了磁盘I/O操作,提高了查询效率。
  • :叶子节点存储实际的数据,并使用双向链表连接。支持高效的顺序访问和范围查询。

优势

  1. 查询性能稳定
    • 在B+树中,所有查询都必须从根节点逐层经过子节点,最终到达叶子节点,保证了查询路径的稳定性。
  2. 支持范围查询
    • B+树的叶子节点形成了有序的双向链表,使得范围查询非常高效。通过链表的顺序访问,B+树能够快速遍历满足条件的数据,从而大大提高了范围查询的效率。

2.什么是最左前缀原则,为什么要有最左前缀原则?

最左前缀原则(Leftmost Prefix Principle) 是一种在解析和匹配字符串的过程中常用的策略,尤其在某些算法和形式语言理论中非常重要。

递归下降解析:语法解析中,如果有多个规则可以匹配,解析器优先选择第一个(最左边的)规则进行匹配。

正则表达式匹配: 默认会选择最左侧的匹配结果

推理引擎:在一些推理问题中,都按照最左侧路径进行处理。

为什么要有最左前缀原则?

  1. 优化查询性能
    最左前缀原则能帮助数据库优化查询。当查询条件包含索引的前缀列时,数据库能通过索引快速定位数据,从而避免全表扫描,提高查询效率。如果查询条件没有按照索引列的顺序排列,则数据库无法完全利用该复合索引,可能导致性能下降。
  2. 提高索引命中率
    索引的顺序决定了查询条件能否高效使用索引。如果查询条件的列顺序不符合复合索引的最左前缀顺序,数据库可能无法使用索引的部分或者全部列,从而影响查询的性能。
  3. 减少不必要的扫描
    按照最左前缀原则,查询能够在索引的前缀部分直接找到匹配的行,减少对整个数据表的扫描。如果索引列顺序不匹配,可能会导致数据库无法使用索引或只能使用部分索引,增加了不必要的数据扫描。

3.什么是索引覆盖?为什么要有索引覆盖?

索引覆盖(Index Covering)指的是数据库查询时,所有需要的数据都可以从索引中直接获取,而不需要访问表中的实际数据行。也就是说,查询的字段完全由索引提供。

为什么要有索引覆盖?

  1. 提升查询效率:避免回表操作(不需要访问实际数据行),减少I/O开销,提高查询速度。
  2. 减少资源消耗:通过索引直接获取数据,减少磁盘和内存的使用,节省系统资源。
  3. 提高响应速度:特别是在大数据量环境下,覆盖索引能显著减少查询时间,提升系统响应性能。

4.MySQL 中的 AUTO_INCREMENT 是如何工作的?

AUTO_INCREMENT 是 MySQL 中一种用于自动生成唯一值的属性,常用于表中的主键列。每当插入新记录时,MySQL 会自动为该列生成一个递增的唯一整数值。

工作原理:

  • AUTO_INCREMENT 值从 1 开始递增(默认情况下),每插入一行记录,值就会自动加 1。
  • AUTO_INCREMENT 的值是线程安全的,可以保证在多个用户同时插入数据时,不会产生重复的值。
  • 可以通过 ALTER TABLE 修改 AUTO_INCREMENT 的起始值或步长。
  • 在删除记录后,AUTO_INCREMENT 的值不会自动回收,如果希望重新利用删除的 ID 值,需要手动设置。

5.什么是数据库的范式(Normalization)?为什么需要规范化设计?

数据库范式是对数据库结构进行规范化的过程,目的是减少冗余数据,避免更新异常,保证数据的一致性。常见的范式有以下几种:

  • 第一范式(1NF)
    关系数据库中的每一列必须包含原子值,即每个字段只能存储一个值,不允许有重复的列或表。
  • 第二范式(2NF)
    在 1NF 的基础上,要求表中的每个非主键列必须完全依赖于主键,避免部分依赖。主要解决了第一范式中可能存在的冗余数据问题。
  • 第三范式(3NF)
    在 2NF 的基础上,要求表中不存在非主键字段对其他非主键字段的依赖,即消除传递依赖。
  • BCNF(博茨-科德范式)
    在 3NF 的基础上,进一步要求每个决定因素都是候选键。
  • 第四范式(4NF)
    消除多值依赖,确保没有两个以上的独立多值依赖存在。

规范化设计的优点:

  • 减少数据冗余:通过拆分表格和避免数据重复,节省存储空间。
  • 提高数据一致性:避免数据不一致的情况,减少数据更新异常。
  • 优化数据修改:数据修改只需要在一个地方进行,减少数据维护的复杂性。

6. 如何优化数据库查询性能?

优化数据库查询性能可以从多个方面入手,以下是一些常见的优化手段:

  • 创建适当的索引
    根据查询的需求,创建索引可以显著提高查询速度,尤其是对于 WHERE 子句、JOIN 条件、ORDER BY 等经常使用的列。然而,过多的索引会影响插入、删除和更新操作的性能。
  • 避免 SELECT * 查询
    使用 SELECT * 会选择所有列,查询性能会受到影响。建议只查询需要的字段。
  • 使用查询缓存
    对于重复查询的场景,开启查询缓存(在 MySQL 中是 query_cache)可以减少数据库的负担,返回缓存的查询结果。
  • 避免在 WHERE 子句中使用函数
    WHERE 子句中使用函数(例如 LOWER(column))会使索引失效,导致全表扫描。尽量避免这种写法。
  • 分页查询优化
    对于需要分页的查询,尤其是数据量较大的表,使用 LIMITOFFSET 时,可能会导致性能问题。优化分页查询可以考虑使用基于索引的查询(如 WHERE id > last_id)来避免性能下降。
  • 合理使用 JOIN 类型
    根据数据表的大小和查询需求,选择合适的 JOIN 类型。如果只需要左表中的记录,可以使用 LEFT JOIN,避免不必要的 INNER JOIN
  • 避免 N+1 查询问题
    当需要获取多个表的关联数据时,要避免产生过多的查询。可以使用 JOIN 来一次性获取所需数据,避免多次查询带来的性能问题。
  • 合理设计数据表
    将数据表拆分成合适的子表,以减少单表的数据量。合理的表结构设计可以显著提高查询和存储效率。
  • 使用合适的存储引擎
    MySQL 提供了多种存储引擎,如 InnoDB 和 MyISAM。InnoDB 支持事务、行级锁等特性,适用于大部分场景;而 MyISAM 适用于读取密集型操作。
  • 避免锁竞争
    在高并发场景下,锁的竞争可能导致性能瓶颈。可以通过调整事务的隔离级别(如设置为 READ COMMITTED)来减少锁的争用。

相关文章:

【MySQL 进阶之路】了解 性能优化 与 设计原则

1.B树的优势 “矮胖”结构: 矮:B树的每个节点存储更多的关键字,从而减少了树的层级(最多三层),减少了磁盘I/O操作,提高了查询效率。胖:叶子节点存储实际的数据,并使用双…...

MySQL之数据库三大范式

一、什么是范式? 范式是数据库遵循设计时遵循的一种规范,不同的规范要求遵循不同的范式。 (范式是具有最小冗余的表结构) 范式可以 提高数据的一致性和 减少数据冗余和 更新异常的问题 数据库有六种范式(1NF/2NF/3NF…...

[大数据]Hudi

G:\Bigdata\17.hudi\大数据技术之数据湖Hudi 第1章 Hudi概述 1.1 Hudi简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服…...

jenkins harbor安装

Harbor是一个企业级Docker镜像仓库‌。 文章目录 1. 什么是Docker私有仓库2. Docker有哪些私有仓库3. Harbor简介4. Harbor安装 1. 什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub,而与Dock…...

JavaScript 高级特性与 ES6 新特性:正则表达式的深度探索

在现代 JavaScript 开发中,正则表达式(Regular Expressions)和高级特性、ES6 新特性的结合使用,能够极大地提升代码的简洁性、可读性和功能性。本文将深入探讨 JavaScript 中的正则表达式及其在高级特性和 ES6 新特性中的应用&…...

正则表达式——参考视频B站《奇乐编程学院》

智能指针 一、背景🎈1.1. 模式匹配🎈1.2. 文本替换🎈1.3. 数据验证🎈1.4. 信息提取🎈1.5. 拆分字符串🎈1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…...

【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )

文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数…...

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务,然而,纯OCR任务偏向于模型的感知能力,对于文档场景,由于文字密度较高,现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时&#xff0…...

Mybatis动态sql执行过程

动态SQL的执行原理主要涉及到在运行时根据条件动态地生成SQL语句,然后将其发送给数据库执行。以下是动态SQL执行原理的详细解释: 一、接收参数 动态SQL首先会根据用户的输入或系统的条件接收参数。这些参数可以是查询条件、更新数据等,它们…...

leetcode 31 Next Permutation

题意 找到下一个permutation是什么,对于一个数组[1,2,3],下一个排列就是[1, 3, 2] 链接 https://leetcode.com/problems/next-permutation/ 思考 首先任何一个permutation满足一个性质,从某个位置往后一定是降序。…...

每日一练 | 华为 eSight 创建的缺省角色

01 真题题目 下列选项中,不属于华为 eSight 创建的缺省角色的是: A. Administrator B. Monitor C. Operator D. End-User 02 真题答案 D 03 答案解析 华为 eSight 是一款综合性的网络管理平台,提供了多种管理和监控功能。 为了确保不同用…...

PyTorch基本使用-自动微分模块

学习目的:掌握自动微分模块的使用 训练神经网络时,最常用的算法就是反向传播。在该算法中,参数(模型权重)会根据损失函数关于对应参数的梯度进行调整。为了计算这些梯度,PyTorch 内置了名为 torch.autogra…...

libevent-Reactor设计模式【1】

一、Libevent概述 1、简介 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大&#…...

奇奇怪怪的错误-Tag和space不兼容

报错信息如下: TabError: inconsistent use of tabs and spaces in indentation make: *** [Makefile:24: train] Error 1不能按Tab,要老老实实按space 不过可以在编辑器里面改,把它们调整成一致的;...

29.攻防世界ics-06

ics-06 难度:1 方向:Web 题目描述: 云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。 进入靶场 发现有一处能点动 多了个id1 我其实尝试改过id数,不过没什么变化&#xf…...

强化学习路径规划:基于SARSA算法的移动机器人路径规划,可以更改地图大小及起始点,可以自定义障碍物,MATLAB代码

一、SARSA算法概述 SARSA(State-Action-Reward-State-Action)是一种在线强化学习算法,用于解决决策问题,特别是在部分可观测的马尔可夫决策过程(POMDPs)中。SARSA算法的核心思想是通过与环境的交互来学习一…...

【MFC】如何读取rtf文件并进行展示

tf是微软的一个带格式的文件,比word简单,我们可以用写字板等程序打开编辑。下面以具体实例讲解如何在自己程序中展示rtf文件。 首先使用VS2022创建一个MFC的工程。 VIEW类需要选择richview类,用于展示,如下图: 运行效…...

Vulhub:Log4j[漏洞复现]

CVE-2017-5645(Log4j反序列化) 启动靶场环境 docker-compose up -d 靶机IPV4地址 ifconfig | grep eth0 -A 5 ┌──(root㉿kali)-[/home/kali/Desktop/temp] └─# ifconfig | grep eth0 -A 5 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 in…...

面向预测性维护的TinyML技术栈全面综述

论文标题&#xff1a;A Holistic Review of the TinyML Stack for Predictive Maintenance&#xff08;面向预测性维护的TinyML技术栈全面综述&#xff09; 作者信息&#xff1a;Emil Njor, Mohammad Amin Hasanpour, Jan Madsen, Xenofon Fafoutis&#xff0c;均来自丹麦技术…...

沈阳理工大学《2024年811自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《沈阳理工大学811自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...