Mysql 学习(八)单表查询方法 一

news2025/1/11 23:50:31

单表访问方法

  • 前面几节我们了解 innodb 的底层数据结构的设计,究其本源我们其实是为了更好的理解如何查询,并且如何使得查询语句更加快速的问题,这节我们就来好好讲一讲
  • 首先我们先来创建一个表
CREATE TABLE index_value_table (
    id INT NOT NULL AUTO_INCREMENT,
    value1 VARCHAR(100),
    value2 INT,
    value3 VARCHAR(100),
    value_part1 VARCHAR(100),
    value_part2 VARCHAR(100),
    value_part3 VARCHAR(100),
    common_field VARCHAR(100),
    PRIMARY KEY (id),
    KEY idx_key1 (value1),
    UNIQUE KEY idx_key2 (value2),
    KEY idx_key3 (value3),
    KEY idx_key_part(value_part1, value_part2, value_part3)
) Engine=InnoDB CHARSET=utf8;
  • 讲一下这个表
    • id 列创建了聚簇索引
    • value1 列创建了idx_key1 二级索引
    • value2 列创建了idx_key2 二级索引,且唯一
    • value3 列创建了idx_key3 二级索引
    • value_part1,value_part2,value_part3 列创建了idx_key_part 二级索引 是一个联合索引
  • 现在假设这张表里面插入了100000条数据

访问方法的概念

  • 我们通常把执行查询语句的方式称之为访问方法
  • 我们查询执行的方案主要是有两种分类:
    • 使用全表扫描进行查询
    • 使用索引进行查询:使用索引进行查询也会有各种方式,具体我们可以分为
      • 针对主键或唯一二级索引的等值查询 Const
      • 针对普通二级索引的等值查询 ref
      • 针对索引列的范围查询 range
      • 直接扫描整个索引 index
  • 下面我具体来说明这几个访问方法

Const:针对主键或唯一二级索引的等值查询

  • 我们通常认为 通过主键和唯一二级索引列 与 常数的等值比较来定位一条记录是非常快的,所以我们也称这种访问方法为 Const,常数级别的。
  • 举个例子,看这个语句:SELECT * FROM index_value_table WHERE id = 1438;
  • 因为条件筛选是聚簇索引,我们知道底层是B+树,B+树叶子节点中的记录是按照索引列排序的,我可以通过二分查找快速的找到对应的ID列的记录,并且找到的时候刚好是叶子节点,所以可以快速地把记录拉出来,执行过程图:
    在这里插入图片描述
  • 在举一个二级索引的例子,看这条语句SELECT * FROM index_value_table WHERE value2 = 3841;
  • 二级索引跟聚簇索引的差别是,多一层查询,我们需要先二分查找,找到对应的值和他的主键,再通过主键去聚簇索引的B+树中找到对应的数据,所以应该也是很快,执行图如下:
    在这里插入图片描述

Ref:针对普通二级索引的等值查询

  • 因为聚簇索引和唯一的二级索引的等值查询,查询到的记录只会有一条,但是普通的二级索引可能会有很多条,所以当我们找那些等值索引的主键时,我们会回表的消耗会比唯一的二级索引消耗大,但是跟全表搜索比性能还是要高很多的,所以我们通常把这种搜索条件为二级索引列与常数等值比较,采用二级索引来执行查询的访问方法称为:ref
  • 举个例子:SELECT * FROM index_value_table WHERE value1 = 'abc';
  • 这个查询的查询过程:
    • 先从idx_key1 的索引树用二分查找定位到value1 中为abc 的记录,因为时连续的,然后找到这些记录对应的主键值
    • 从聚簇索引树中,通过这些主键定位到完整的记录
      在这里插入图片描述
  • 但这种还是会有一些特殊情况:
    • 二级索引存在NULL的情况:不论是普通的二级索引,还是唯一二级索引,它们的索引列对包含NULL值的数量并不限制,所以我们采用key IS NULL这种形式的搜索条件最多只能使用ref的访问方法,而不是const的访问方法。
    • 对于某个包含多个索引列的二级索引来说,只要是最左边的连续索引列是与常数的等值比较就可能采用ref的访问方法,比如下面几个
      • SELECT * FROM index_value_table WHERE key_part1 = 'abc';
      • SELECT * FROM index_value_table WHERE key_part1 = 'abc' AND key_part2 = 'def';
      • SELECT * FROM index_value_table WHERE key_part1 = 'abc' AND key_part2 = 'def' AND key_part3 = 'ghi';
    • 不仅想找出某个二级索引列的值等于某个常数的记录,还想把该列的值为NULL的记录也找出来,sql如下: SELECT * FROM index_value_table WHERE value1 = 'abc' OR value1 IS NULL;,这种时候的访问方法也是ref,但有点特殊叫 ref_or_null ,执行过程如下:
      • 先从idx_key1 的索引树用二分查找定位到value1 中为abc 和 value1 是 null 的记录,然后找到这些记录对应的主键值
    • 从聚簇索引树中,通过这些主键定位到完整的记录
      在这里插入图片描述

Range:针对索引列的范围查询

  • 我们查询当然不止是等值查询,还会有范围查询,当我们是范围查询这种更加复杂的搜索条件的时候怎么办呢?
  • 举个例子:SELECT * FROM index_value_table WHERE value2 IN (1438, 6328) OR (value2 >= 38 AND value2 <= 79);
  • 这种情况我们查询可以有两种,一个是全表查询,一个是通过二级索引+回表的方式执行,当然是采用第二个啦,我们来看看如何查询
    • 因为条件复杂,所以这个时候不再是简单的等值查询,而是通过value2列的值匹配下面三个范围中任何一个算在内
      • 值等于 1438
      • 值等于 6328
      • 值在 38 和 79 之间
    • 然后通过遍历索引树找到对应的主键进行回表
  • 这种通过范围查询的访问方法称之为 range

Index:直接扫描整个索引

  • 这个访问方法通过例子来说明比较简单,看下面的sql SELECT value_part1, value_part2, value_part3 FROM index_value_table WHERE value_part2 = 'abc';
  • 这个查询有一个问题,就是搜索条件不符合最左匹配原则,所以无法触发ref 和 range 访问,那他会不会触发索引查询呢?
  • 答案是会,主要有两个原因
    • 查询字段里面只有三个列,这三个列还都是联合索引 idx_key_part 中的字段
    • 搜索条件的value_part2 也是这个联合索引的字段
  • 索引我们可以直接通过遍历 idx_key_part 这个索引树来获取数据,这肯定比全表查询要快,而我们通常把这种遍历二级索引树的执行方法称之为 index

All:全表查询

  • 顾名思义,我们通常把全表扫描称之为all

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

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

相关文章

Redis --- 哨兵、分片集群

一、Redis哨兵 Redis提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 1.1、哨兵原理 集群结构和作用 哨兵的结构如图&#xff1a; 哨兵的作用如下&#xff1a; 监控&#xff1a;Sentinel 会不断检查您的master和slave是否按预期工作 自动故障…

mysql 排名与排序

MySQL 8.0 版本新增 两个排名函数 分别是 ROW_NUMBER() 与 RANK() 用法 SELECT ROW_NUMBER() OVER(ORDER BY id) AS rowNo, name FROM users; SELECT RANK() OVER(ORDER BY score DESC) AS rankNo, name, score FROM students;后面跟 OVER&#xff08;&#xff09;括号里…

惠普星 TP01-055ccn电脑重装系统步骤

如果你的惠普星 TP01-055ccn电脑出现了系统问题&#xff0c;或者你想更换一个全新的微软操作系统&#xff0c;自己有不清楚相关的重装系统步骤怎么办&#xff1f;别担心&#xff0c;你可以参考以下的惠普星 TP01-055ccn电脑重装系统步骤来执行。 ​ 惠普星 TP01-055ccn电脑怎…

第1章 .Net7 Areas实现

1 集成路由匹配模式 var builder WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); var app builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { …

【LeetCode】376. 摆动序列

376. 摆动序列 思路 首先&#xff0c;我们可以将摆动序列分为两种&#xff1a; 「上升摆动序列」&#xff0c;当且仅当该序列是摆动序列&#xff0c;且最后一个元素呈上升趋势。如序列 [1,3,2,4] 即为「上升摆动序列」。 「下降摆动序列」&#xff0c;当且仅当该序列是摆动序…

深度解读:《数字孪生世界白皮书(2023)》全方位剖析

2023年初&#xff0c;中国信息通信研究院发布了《数字孪生城市产业图谱研究报告&#xff08;2022&#xff09;》&#xff0c;报告中提出我国数字孪生产业四阶段体系&#xff0c;2020年到2030年是我国数字孪生产业增长期&#xff0c;当前数字孪生市场需求和技术均处于高速发展阶…

腹部肿瘤内科专家朱利明:化疗也能“订制”,晚期结直肠癌不再“无药可救”

肠癌是发生在结肠和直肠的癌症&#xff0c;近二三十年来发病率快速上升。就在近期&#xff0c;“日本女大胃王菅原初代患肠癌病逝”的消息登上热搜&#xff0c;一时引发网友关注热议。 “人生有哲学三问&#xff1a;我是谁&#xff1f;我从哪里来&#xff1f;我到哪里去&#x…

window下sql-server备份后,拷贝到centos上

一.window下sql-server management 打开本地数据库&#xff0c;点备份 二.拷贝到centos下对应目录 mkdir -p /var/opt/mssql/backup 三.在 Linux 上还原数据库 下列步骤使用 sqlcmd 工具。 如果尚未安装 SQL Server 工具&#xff0c;请按照以下步骤安装&#xff1a; ●(1)用…

DJ5-3/4 中断处理程序和设备驱动程序

目录 5.3 中断机构和中断处理程序 5.3.1 中断简介 5.3.2 中断处理程序 5.4 设备驱动程序 5.4.1 设备驱动程序概述 5.4.2 设备驱动程序的处理过程 5.4.3 对 I/O 设备的控制方式 5.3 中断机构和中断处理程序 5.3.1 中断简介 1、中断和陷入 -- CPU 外部事件和内…

基于C++的通讯管理系统

1、系统需求 通讯录是一个可以记录亲人、好友信息的工具。本教程主要利用C来实现-个通讯录管理系统 系统中需要实现的功能如下: ●添加联系人:向通讯录中添加新人&#xff0c;信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人 ●显示联系人:显示通讯录中所有联系…

手把手教你搭建ROS阿克曼转向小车之(增量式PID代码实现)

在上一篇文章中我们已经成功的把编码器的反馈值给计算出来&#xff0c;这篇文章将会讲解怎么使用反馈回来的速度值进行PID计算&#xff0c;从而闭环控制电机的速度。 PID算法介绍 1.开环控制系统 开环控制系统(open-loop control system)是指被控对象的输出(被控制量)对控制器…

【软件开发】从单机到分布式

从单机到分布式 1.单台服务器应用 问题&#xff1a;由于流量越来越大出现服务器性能问题。 2.应用服务器和数据库服务器分离 对架构增加了一台服务器&#xff0c;应用和数据库分别部署到不同的服务器上&#xff0c;对于开发和测试没有任何影响&#xff0c;只需要应用服务器新…

画了个 MSP430F149的最小系统板 开源出来了

使用MSP430F149单片机设计的一个最小系统板&#xff0c;包含晶振电路、复位电路、CH340串口和BSL下载电路、按键和LED电路等&#xff0c;使用了Type-C接口作为供电和串口通信&#xff0c;另外引出了JTAG接口&#xff0c;所有IO口都引出了。 板载了3个按键和LED&#xff0c;可以…

项目范围说明书如何编写?

范围说明书是一份定义了项目范围的所有要素以及假设、项目要求和验收标准的文件。项目范围说明书将作为主要工具&#xff0c;供利益相关者和团队成员参考&#xff0c;并作为准确衡量项目成功的准则。 项目范围说明书是范围管理计划的一部分&#xff0c;包含了管理项目范围的所…

百度智能云联合发布《雄安新区2022年大数据研究报告》

近日&#xff0c;百度智能云、百度研究院商业智能实验室联合发布《未来之城 雄姿初显——雄安新区2022年大数据研究报告》&#xff08;以下简称《报告》&#xff09;&#xff0c;运用人工智能和大数据分析技术&#xff0c;全面呈现过去一年雄安新区在承接疏解、生态治理、城市建…

Golang当中的定时器

定时器 前言定时器的基本使用 前言 在平时写代码的时候&#xff0c;我们经常会遇到在将来某个时间点或者间隔一段时间重复执行函数。这个时候我们就可以考虑使用定时器。本片文章主要介绍一下golang当中的几个常用的定时器。time.Timer,time.Ticker,time.After以及time.AfterF…

文鼎创智能物联云原生容器化平台实践

作者&#xff1a;sekfung&#xff0c;深圳市文鼎创数据科技有限公司研发工程师&#xff0c;负责公司物联网终端平台的开发&#xff0c;稳定性建设&#xff0c;容器化上云工作&#xff0c;擅长使用 GO、Java 开发分布式系统&#xff0c;持续关注分布式&#xff0c;云原生等前沿技…

《安富莱嵌入式周报》第311期:300V可调节全隔离USB PD电源,开源交流负载分析仪,CANFD Trace,6位半多斜率精密ADC设计,开源数学库

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1Hh4y1H7dR 《安富莱嵌入式周报》第311期&#xff1a;300V可调…

【机器学习】决策树算法解读

【机器学习】决策树算法解读 文章目录 【机器学习】决策树算法解读1. 介绍1.1 优缺点1.2 结构1.3 学习过程1.4 决策树与条件概率分布 2. 决策树学习过程2.1 训练策略2.2 特征选择2.2.1 信息增益和条件熵 2.3 决策树的生成2.3.1 ID32.3.2 C4.52.3.3 CART2.3.4 小结 2.4 决策树的…

Nacos配置中心、配置热更新、及配置共享的记录

Nacos除了提供了注册中心的功能,同样也提供了配置中心的功能,用于管理一些叫常改动的配置 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#xff0c;可以集中…