【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)来减少锁的争用。

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

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

相关文章

Spring Boot集成Knife4j文档工具

Knife4j 搭建 Knife4j环境的的搭建和Swagger一样都比较简单,只需要极简的配置即可。 maven依赖 我使用的是较高版本的基于openapi规范的依赖包,OpenAPI2(Swagger)规范是Knife4j之前一直提供支持的版本,底层依赖框架为Springfox。 此次在4…

LightRAG测试BUG

错误一: LightRAG无法回答错误: INFO:lightrag:kw_prompt result:{{"high_level_keywords": ["xxx", "xxx"],"low_level_keywords": ["xxx", "xxx", "xxx"] }} JSON parsing e…

keil5搜索框还有左侧文件状态栏不见的问题

点击上面的window,弹出 reset view to default ,然后点击,再点击reset,就ok了

基于Mybatis,MybatisPlus实现数据库查询分页功能

基于Mybatis,MybatisPlus实现数据库查询分页功能 目录 基于Mybatis,MybatisPlus实现数据库查询分页功能使用Mybatis插件实现分页数据库准备分页插件配置和使用常用数据: 使用MybatisPlus插件实现分页数据库准备分页插件配置和使用自定义分页查…

python脚本将多个txt文件的内容合并为一个

以下是一个简单的 Python 脚本,可以将指定目录中的多个 .txt 文件的内容合并到一个文件中: 脚本代码 import osdef merge_txt_files(input_dir, output_file):"""将指定目录中的所有txt文件合并到一个文件中。:param input_dir: 包含tx…

HNU_多传感器(专选)_作业4(构建单层感知器实现分类)

1. (论述题)(共1题,100分) 假设平面坐标系上有四个点,要求构建单层感知器实现分类。 (3,3),(4,3) 两个点的标签为1; (1,1),(0,2) 两个点的标签为-1。 思路:要分类的数据是2维数据,需要2个输入…

内圆弧转子泵绘制工具开发

接着上期的Gerotor 泵的话题继续。最近有小伙伴找我开发一个内圆弧摆线泵的计算绘制工具,也就是把上次计算绘制的过程做成一个桌面应用工具,这样用起来会更方便、效率更高。那究竟是什么样的工具呢?一起来看看: 前面不是已经有了上…

面试技术点之安卓篇

一、基础 二、高级 三、组件 Android中SurfaceView和TextureView有什么区别? 参考 Android中SurfaceView和TextureView有什么区别? 四、三方框架 五、系统源码 六、性能优化

【汇编】思考汇编中的两个基本问题

1. 若干年前的疑问 几年前还在大学学习汇编时,不管是考试还是课程设计,其实都很顺利。但是心里一直对什么时候使用哪个寄存器存在疑惑,编写汇编时,没有十足的把握,都是抱着试一试的心态去完成了课程任务。 工作八年有…

在Ubuntu 2404上使用最新的PicGo

在转向Ubuntu之后,果断下载了今年最新的Ubuntu2404,但是随之而来的是底层组件的更新,很多以前可以畅快使用的软件,因为需要老版本的组件而不能正确运行,PicGo就是如此 我们从这里打开Release列表 其中Ubuntu可用的只有这个AppIma…

用ue5打开网址链接

需要用到 Launch URL 这个函数 字面意思就是打开填写的链接网页 这里填写的是百度,按下Tab键后就会打开百度的网页

ISP(Image Signal Processor)——HDR技术总结

传统多帧融合技术 拍摄一系列不同曝光时长的图像帧(LDR),然后使用融合算法进行融合成HDR图像。 融合算法可以分为两种 基于照度图估计的融合 基于照度估计需要拟合相机响应函数,详细可以参考如下论文: Recovering H…

C++打造局域网聊天室第七课: Socket编程初步2

文章目录 前言一、Socket的API函数二、服务端建立Socket步骤总结 前言 C打造局域网聊天室第七课: Socket编程初步2 一、Socket的API函数 接着上一课的内容,我们在chartroom.cpp中找到如下位置 插入断点,运行 运行到断点处后,按…

QT(QML语法)-属性(声明,初始化,赋值,属性绑定,属性组,对象列表。属性别名(双向))

目录 1.属性(Property) 2. 对象列表 3. 属性组 4.代码示例 1.属性(Property) 基本属性声明:property 用于声明可绑定的属性。属性绑定:属性可以绑定到对象属性或函数。属性别名:使用 prope…

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…

Wallpaper壁纸制作学习记录11

操控变形动画介绍 操控变形是使用Wallpaper Engine为角色和某些对象创建复杂动画的一种高级方法。操控变形是一个多步骤过程,要求您有一个单独的图像图层,其中包含要制作动画的角色或对象的剪切图。 操控变形功能相对复杂,您也可以创建仅包含…

黑马程序员Java项目实战《苍穹外卖》Day12

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现:工作台、数据导出 工作台效果图: 数据导出效果图: 在数据统计页面点击数据导出:生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…

windows下Qt5自动编译配置QtMqtt环境

原文链接:windows下Qt5自动编译配置QtMqtt环境(11)-CSDN博客 1、概述 Qt默认是不包含mqtt库的,如果需要使用到mqtt库就只能自己编译配置;网络所有的QtMqtt配置的文章都是编译完成手动复制,非常麻烦&#x…

OpenCV相机标定与3D重建(15)计算给定图像点对应的极线(epipolar lines)函数computeCorrespondEpilines()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算给定图像点对应的极线(epipolar lines)。 对于立体图像对中一个图像的点,计算这些点在另一个图像中对应的…

阿里云服务器Linux(centos)系统安装nginx1.20.2

阿里云服务器Linux(centos)系统安装nginx1.20.2 1.安装依赖包 一共要安装4种依赖(基于c语言) yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.下载nginx安装包并解压安装包 nginx官网下载:http://nginx.org/en/do…