MySQL篇(一):慢查询定位及索引、B树相关知识详解

MySQL篇(一):慢查询定位及索引、B树相关知识详解

  • MySQL篇(一):慢查询定位及索引、B树相关知识详解
    • 一、MySQL中慢查询的定位
      • (一)慢查询日志的开启
      • (二)慢查询日志内容分析
      • (三)慢查询分析工具
      • (四)慢查询的常见原因
    • 二、索引
      • (一)索引的定义
      • (二)索引的作用
      • (三)索引的创建方式
      • (四)索引的类型
      • (五)索引的底层数据结构
    • 三、B树和B+树的区别
      • (一)节点数据存储
      • (二)查询过程
      • (三)范围查询支持
      • (四)插入和删除操作
      • (五)应用场景

MySQL篇(一):慢查询定位及索引、B树相关知识详解

一、MySQL中慢查询的定位

(一)慢查询日志的开启

在MySQL中,慢查询日志是定位慢查询的重要工具。

  1. 通过配置文件开启
    • 编辑MySQL的配置文件(通常是my.cnfmy.ini)。找到或添加以下配置:
    [mysqld]
    slow_query_log = 1
    slow_query_log_file = /var/lib/mysql/your_mysql_server_name-slow.log
    long_query_time = 2
    
    • 这里slow_query_log = 1表示开启慢查询日志;slow_query_log_file指定慢查询日志文件的路径和名称;long_query_time = 2表示查询执行时间超过2秒的语句会被记录到慢查询日志中。修改配置文件后,需要重启MySQL服务使配置生效。
  2. 动态开启(无需重启服务)
    • 可以通过SQL语句动态开启慢查询日志:
    SET GLOBAL slow_query_log = 'ON';
    SET GLOBAL long_query_time = 2;
    
    • 这种方式设置的参数,在MySQL服务重启后会失效。如果需要永久生效,还是建议修改配置文件。

(二)慢查询日志内容分析

慢查询日志记录了慢查询的详细信息,包括查询执行时间、查询语句、使用的数据库等。例如,慢查询日志中的一条记录可能如下:

# Time: 230915 15:30:45
# User@Host: root[root] @ localhost []
# Thread_id: 10  Schema: test  QC_hit: No
# Query_time: 3.500000  Lock_time: 0.000000  Rows_sent: 10  Rows_examined: 1000
SET timestamp=1694700645;
SELECT * FROM user WHERE age > 30;
  • Time:记录查询发生的时间。
  • User@Host:执行查询的用户和主机信息。
  • Query_time:查询执行的时间,单位是秒。
  • Rows_examined:查询过程中扫描的行数,这个值越大,通常说明查询效率越低。
  • 查询语句:具体的SQL查询语句。

(三)慢查询分析工具

  1. mysqldumpslow工具
    • mysqldumpslow是MySQL自带的慢查询分析工具。例如,要查看慢查询日志中执行时间最长的10条查询:
    mysqldumpslow -s t -t 10 /var/lib/mysql/your_mysql_server_name-slow.log
    
    • -s t表示按照查询时间排序,-t 10表示只显示前10条记录。
    • 还可以通过其他参数进行更复杂的分析,比如按照扫描行数排序:
    mysqldumpslow -s r -t 10 /var/lib/mysql/your_mysql_server_name-slow.log
    
    • -s r表示按照扫描行数排序。
  2. pt-query-digest工具(Percona Toolkit的一部分)
    • pt-query-digest功能更强大,它可以对慢查询日志进行更深入的分析,生成详细的报告。首先需要安装Percona Toolkit:
    • 在Ubuntu系统上:
    sudo apt-get install percona-toolkit
    
    • 使用pt-query-digest分析慢查询日志:
    pt-query-digest /var/lib/mysql/your_mysql_server_name-slow.log
    
    • 它会输出查询的摘要信息,包括查询执行时间分布、查询模式、最耗时的查询等。例如,会显示类似以下的内容:
    # Profile
    # Rank Query ID Response time Calls Rows Rows examine
    # ==== ================== ============== ====== ====== ===========
    # 1 0x1234567890abcdef 10.000000 1 10 1000
    SELECT * FROM user WHERE age > 30;
    

(四)慢查询的常见原因

  1. 缺少索引
    • 如果查询语句没有使用合适的索引,MySQL可能需要全表扫描。例如:
    SELECT * FROM order WHERE customer_name = 'John';
    
    • 如果customer_name字段没有索引,当order表数据量很大时,查询会非常慢。此时可以为customer_name字段创建索引:
    CREATE INDEX idx_customer_name ON order (customer_name);
    
  2. 复杂的查询逻辑
    • 包含大量的JOIN、子查询、聚合函数等复杂逻辑的查询可能会很慢。例如:
    SELECT u.name, SUM(o.amount)
    FROM user u
    JOIN order o ON u.id = o.user_id
    GROUP BY u.name;
    
    • 如果user表和order表数据量都很大,且没有合适的索引,这个查询可能会很慢。可以优化JOIN条件,为关联字段创建索引,如为user.idorder.user_id创建索引。
  3. 锁等待
    • 在事务环境下,长时间的锁等待也会导致查询变慢。例如,一个事务对某条记录加锁后,另一个查询需要等待锁释放。可以通过查看MySQL的锁状态相关视图(如INFORMATION_SCHEMA.INNODB_LOCKS)来分析锁等待问题。

二、索引

(一)索引的定义

索引是一种数据结构,用于快速查找数据库表中的记录。它就像一本书的目录,通过索引可以快速定位到需要的数据,而不需要遍历整个表。在MySQL中,索引存储在磁盘上(InnoDB引擎也会将常用索引加载到内存中),不同的存储引擎支持的索引类型有所不同。

(二)索引的作用

  1. 提高查询效率
    • 最主要的作用是加快查询速度。例如,在有索引的情况下,查询语句SELECT * FROM product WHERE price > 100;可以通过索引快速定位到价格大于100的产品记录,而不是全表扫描。
  2. 保证数据的唯一性
    • 唯一索引可以确保表中某一列或几列的组合值是唯一的。例如,为user表的email字段创建唯一索引:
    CREATE UNIQUE INDEX idx_email ON user (email);
    
    • 这样就可以保证email字段的值在表中是唯一的,避免重复数据。
  3. 支持JOIN操作
    • 在JOIN操作中,索引可以加快表与表之间的关联速度。当两个表通过关联字段进行JOIN时,如果关联字段有索引,MySQL可以更高效地匹配记录。

(三)索引的创建方式

  1. 创建表时创建索引
    • 在创建表的SQL语句中直接定义索引。例如:
    CREATE TABLE student (id INT PRIMARY KEY,name VARCHAR(50),age INT,INDEX idx_age (age)
    );
    
    • 这里PRIMARY KEY创建了主键索引,同时INDEX idx_age (age)创建了一个普通的age字段索引。
  2. 使用CREATE INDEX语句创建索引
    • 对于已经存在的表,可以使用CREATE INDEX语句创建索引。例如:
    CREATE INDEX idx_name ON student (name);
    
    • 这会为student表的name字段创建一个索引。
  3. 使用ALTER TABLE语句创建索引
    • 也可以通过ALTER TABLE语句为表添加索引。例如:
    ALTER TABLE student ADD INDEX idx_age_name (age, name);
    
    • 这创建了一个组合索引,包含agename两个字段。

(四)索引的类型

  1. 普通索引(INDEX)
    • 最基本的索引类型,没有任何限制。可以加速查询,但是不保证数据的唯一性。例如:
    CREATE INDEX idx_city ON address (city);
    
  2. 唯一索引(UNIQUE INDEX)
    • 保证索引列的值是唯一的。如前面提到的为email字段创建唯一索引。
    CREATE UNIQUE INDEX idx_unique_email ON user (email);
    
  3. 主键索引(PRIMARY KEY)
    • 是一种特殊的唯一索引,用于标识表中的唯一记录。每个表只能有一个主键索引。在创建表时定义主键:
    CREATE TABLE product (id INT PRIMARY KEY,product_name VARCHAR(100)
    );
    
  4. 组合索引(复合索引)
    • 由多个字段组成的索引。例如,为order表的order_datecustomer_id创建组合索引:
    CREATE INDEX idx_order_date_customer_id ON order (order_date, customer_id);
    
    • 使用组合索引时,需要注意索引的顺序。查询条件中使用索引字段的顺序要与创建索引时的顺序一致(遵循最左匹配原则),才能有效使用索引。
  5. 全文索引(FULLTEXT INDEX)
    • 主要用于全文搜索,在MySQL中,InnoDB和MyISAM存储引擎都支持全文索引。例如,为article表的content字段创建全文索引:
    CREATE FULLTEXT INDEX idx_content ON article (content);
    
    • 然后可以使用MATCH AGAINST语句进行全文搜索:
    SELECT * FROM article WHERE MATCH(content) AGAINST('keyword' IN NATURAL LANGUAGE MODE);
    

(五)索引的底层数据结构

  1. 哈希表(Hash)
    • 哈希索引通过哈希函数将索引值映射到哈希表中。它的优点是查询效率高,等值查询速度快。但是,哈希索引不支持范围查询,并且在数据量较大时可能会出现哈希冲突。MySQL中Memory存储引擎支持哈希索引。例如:
    • 创建Memory表并使用哈希索引:
    CREATE TABLE test_hash (id INT,value VARCHAR(50),INDEX USING HASH (id)
    ) ENGINE = MEMORY;
    
  2. B树和B+树
    • B树
      • B树是一种自平衡的树结构,它的每个节点可以包含多个键值对和子节点。B树的特点是能够在相对较少的磁盘I/O操作下完成查询。在B树中,每个节点中的键值是有序排列的,并且子节点的键值范围也与父节点的键值相关。例如,在一个存储整数的B树中,父节点的某个键值会作为左右子节点键值范围的分界点。
      • 当进行查询时,从根节点开始,根据键值与节点中键值的比较,决定进入哪个子节点,直到找到目标键值或确定目标键值不存在。
    • B+树
      • B+树是B树的一种变形。与B树相比,B+树有以下特点:
        • 节点数据:B+树的非叶子节点只存储键值,不存储数据记录,数据记录都存储在叶子节点中。而B树的非叶子节点既存储键值,也可能存储数据记录。
        • 查询方式:B+树的查询必须到叶子节点才能找到数据记录,而B树在非叶子节点找到键值时就可能找到数据记录。
        • 范围查询:B+树的叶子节点之间通过指针连接,形成一个有序的链表,这使得范围查询非常高效。例如,查询WHERE age BETWEEN 20 AND 30,在B+树上可以通过叶子节点的链表快速遍历范围内的记录。而B树在进行范围查询时相对复杂。
      • 在MySQL的InnoDB存储引擎中,索引主要使用B+树结构。例如,聚簇索引(通常是主键索引)的叶子节点存储了完整的数据记录,而辅助索引(普通索引、唯一索引等)的叶子节点存储的是主键值,通过主键值再去聚簇索引中查找完整的数据记录。

三、B树和B+树的区别

(一)节点数据存储

  1. B树
    • B树的非叶子节点既存储键值,也可能存储数据记录。这意味着在B树中,找到某个键值时,可能在非叶子节点就已经找到对应的数据记录,不需要一直遍历到叶子节点。例如,在一个小型的B树中,根节点可能包含多个键值和少量的数据记录,当查询的键值正好在根节点时,就可以直接获取数据。
  2. B+树
    • B+树的非叶子节点只存储键值,不存储数据记录。数据记录全部存储在叶子节点中。这样做的好处是,非叶子节点可以存储更多的键值,从而减少树的高度,降低磁盘I/O操作次数。例如,在一个大型的B+树中,非叶子节点专注于存储键值,形成更高效的索引结构,而叶子节点存储数据记录,并且通过指针连接,方便范围查询。

(二)查询过程

  1. B树
    • 进行查询时,从根节点开始,比较键值与节点中的键值,决定进入哪个子节点。如果在非叶子节点找到目标键值,就可以直接获取数据记录,不需要继续遍历到叶子节点。这种查询方式在某些情况下可能会更快地获取数据,但也可能因为非叶子节点存储数据记录而导致节点空间利用不够高效。
  2. B+树
    • 查询必须从根节点开始,一直遍历到叶子节点才能找到数据记录。虽然看起来查询路径可能更长,但由于B+树的非叶子节点存储更多键值,树的高度相对较低,整体的磁盘I/O次数可能更少。而且,B+树的叶子节点形成有序链表,对于范围查询和排序操作非常有利。

(三)范围查询支持

  1. B树
    • B树对范围查询的支持相对较弱。因为B树的非叶子节点可能存储数据记录,且叶子节点之间没有直接的指针连接,在进行范围查询时,需要不断地回溯和遍历不同的子树,操作比较复杂,效率较低。
  2. B+树
    • B+树的叶子节点通过指针连接成一个有序的链表,这使得范围查询非常高效。例如,查询WHERE salary BETWEEN 5000 AND 10000,在B+树上,只需要找到第一个满足条件的叶子节点,然后沿着链表依次遍历,就可以获取所有满足条件的记录,大大提高了范围查询的效率。

(四)插入和删除操作

  1. B树
    • B树在插入和删除操作时,需要维护树的平衡,操作相对复杂。当插入或删除一个键值时,可能会导致节点的分裂或合并,需要调整多个节点的键值和子节点关系。
  2. B+树
    • B+树的插入和删除操作也需要维护树的平衡,但由于其结构特点,相对B树来说,操作可能更规则一些。例如,在插入操作中,B+树主要在叶子节点进行插入,非叶子节点的调整相对有规律;在删除操作中,也可以通过叶子节点的链表关系和非叶子节点的键值调整,更有效地维护树的平衡。

(五)应用场景

  1. B树
    • 由于B树在某些特定场景下,非叶子节点存储数据记录可能会有一定优势,例如在一些小型数据库系统或对数据存储密度有特殊要求的场景中可能会使用B树。但总体来说,B树在数据库索引中的应用不如B+树广泛。
  2. B+树
    • B+树非常适合用于数据库索引,尤其是在像MySQL的InnoDB存储引擎中。它的结构特点使得查询效率高,特别是对于范围查询和排序操作,能够很好地满足数据库的各种查询需求。无论是普通的单表查询,还是多表JOIN操作,B+树索引都能发挥重要作用。

通过以上对MySQL慢查询定位、索引以及B树和B+树区别的详细介绍,希望能帮助读者深入理解相关知识,在实际的数据库开发和优化中更好地应用这些内容。

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

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

相关文章

uniapp APP端在线升级(简版)

设计思路: 1.版本比较:应用程序检查其当前版本与远程服务器上可用的最新版本 2. 更新状态指示:如果应用程序是不是最新的版本,则页面提示下载最新版本。 3.下载启动:通过plus.downloader.createDownload()启动新应用…

基于javaweb的SpringBoot教务课程管理设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

使用大语言模型进行Python图表可视化

Python使用matplotlib进行可视化一直有2个问题,一是代码繁琐,二是默认模板比较丑。因此发展出seaborn等在matplotlib上二次开发,以更少的代码进行画图的和美化的库,但是这也带来了定制化不足的问题。在大模型时代,这个…

【JavaEE】MyBatis - Plus

目录 一、快速使用二、CRUD简单使用三、常见注解3.1 TableName3.2 TableFiled3.3 TableId 四、条件构造器4.1 QueryWrapper4.2 UpdateWrapper4.3 LambdaQueryWrapper4.4 LambdaUpdateWrapper 五、自定义SQL 一、快速使用 MyBatis Plus官方文档:MyBatis Plus官方文档…

采用前端技术开源了一个数据结构算法的可视化工具

今天要推荐的开源项目叫VisuAlgoX,是一个面向计算机科学和游戏开发的 交互式算法可视化工具,帮助用户通过直观的动画理解各种数据结构和算法。 项目的前身 由于最近在做一些关于游戏和图形化方面的文章,因此做了一部分相关算法的动态可视化来做配图展示…

体验智谱清言的AutoGLM进行自动化的操作(Chrome插件)

最近体验了很多的大模型,大模型我是一直关注着ChatGLM,因为它确实在7b和8b这档模型里,非常聪明! 最近还体验了很多大模型的应用软件,比如Agently、5ire、 mcphost、 Dive、 NextChat等。但是这些一般都是图形界面或者…

pytorch中dataloader自定义数据集

前言 在深度学习中我们需要使用自己的数据集做训练,因此需要将自定义的数据和标签加载到pytorch里面的dataloader里,也就是自实现一个dataloader。 数据集处理 以花卉识别项目为例,我们分别做出图片的训练集和测试集,训练集的标…

Blender模型导入虚幻引擎设置

单位系统不一致 Blender默认单位是米(Meters),而虚幻引擎默认使用**厘米(Centimeters)**作为单位。 当模型从Blender导出为FBX或其他格式时,如果没有调整单位,虚幻引擎会将1米(Blen…

Docker基础详解

Docker 技术详解 一、概述 Docker官网:https://docs.docker.com/ 菜鸟教程:https://www.runoob.com/docker/docker-tutorial.html 1.1 什么是Docker? Docker 是一个开源的容器化平台,它允许开发者将应用程序和其依赖项打包到…

FastPillars:一种易于部署的基于支柱的 3D 探测器

FastPillars:一种易于部署的基于支柱的 3D 探测器Report issue for preceding element Sifan Zhou 1 , Zhi Tian 2 , Xiangxiang Chu 2 , Xinyu Zhang 2 , Bo Zhang 2 , Xiaobo Lu11{}^{1}start_FLOATSUPERSCRIPT 1 end_FLOATSUPERSCRIPT11footnotemark: 1 Chengji…

NLP语言模型训练里的特殊向量

1. CLS 向量和 DEC 向量的区别及训练方式 (1) CLS 向量与 DEC 向量是否都是特殊 token? CLS 向量([CLS] token)和 DEC 向量(Decoder Input token)都是特殊的 token,但它们出现在不同类型的 NLP 模型中&am…

字节跳动 UI-TARS 汇总整理报告

1. 摘要 UI-TARS 是字节跳动开发的一种原生图形用户界面(GUI)代理模型 。它将感知、行动、推理和记忆整合到一个统一的视觉语言模型(VLM)中 。UI-TARS 旨在跨桌面、移动和 Web 平台实现与 GUI 的无缝交互 。实验结果表明&#xf…

基于Python深度学习的鲨鱼识别分类系统

摘要:鲨鱼是海洋环境健康的指标,但受到过度捕捞和数据缺乏的挑战。传统的观察方法成本高昂且难以收集数据,特别是对于具有较大活动范围的物种。论文讨论了如何利用基于媒体的远程监测方法,结合机器学习和自动化技术,来…

【漫话机器学习系列】168.最大最小值缩放(Min-Max Scaling)

在机器学习和数据预处理中,特征缩放(Feature Scaling) 是一个至关重要的步骤,它可以使模型更稳定,提高训练速度,并优化收敛效果。最大最小值缩放(Min-Max Scaling) 是其中最常见的方…

开源测试用例管理平台

不可错过的10个开源测试用例管理平台: PingCode、TestLink、Kiwi TCMS、Squash TM、FitNesse、Tuleap、Robot Framework、SpecFlow、TestMaster、Nitrate。 开源测试用例管理工具提供了一种透明、灵活的解决方案,使团队能够在不受限的情况下适应具体的测…

鸿蒙阔折叠Pura X外屏开发适配

首先看下鸿蒙中断点分类 内外屏开合规则 Pura X开合连续规则: 外屏切换到内屏,界面可以直接接续。内屏(锁屏或非锁屏状态)切换到外屏,默认都显示为锁屏的亮屏状态。用户解锁后:对于应用已适配外屏的情况下,应用界面可以接续到外屏。折叠外屏显示展开内屏显示折叠状态…

DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC

drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1); 这两行代码用于启用 Linux DRM(Direct Rendering Manager)客户端的两个关键特性,具体作用如下: 1. drmSetClientCap…

敏捷开发10:精益软件开发和看板kanban开发方法的区别是什么

简介 精益生产起源于丰田生产系统,核心是消除浪费,而看板最初是由丰田用于物料管理的信号卡片,后来被引入软件开发。 Kanban 后来引入到敏捷开发中,强调持续交付和流程可视化。 精益软件开发原则是基于精益生产的原则&#xff0…

用matlab探索卷积神经网络(Convolutional Neural Networks)-3

5.GoogLeNet中的Filters 这里我们探索GoogLeNet中的Filters,首先你需要安装GoogLeNet.在Matlab的APPS里找到Deep Network Designer,然后找到GoogLeNet,安装后的网络是没有右下角的黄色感叹号的,没有安装的神经网络都有黄色感叹号。 一个层&a…

Verilog中X态的危险:仿真漏掉的bug

由于Verilog中X态的微妙语义,RTL仿真可能PASS,而网表仿真却会fail。 目前进行的网表仿真越来越少,这个问题尤其严重,主要是网表仿真比RTL仿真慢得多,因此对整个回归测试而言成本效益不高。 上面的例子中,用Verilog RTL中的case语句描述了一个简单的AND函数,它被综合成AN…