MySQL - 单表访问

单表访问

查询方式

MySQL查询的执行方式大致分为下边两种:

  • 使用全表扫描进行查询

    这种执行方式很好理解,就是把表的每一行记录都扫一遍嘛,把符合搜索条件的记录加入到结果集就完了。不管是啥查询都可以使用这种方式执行,当然,这种也是最笨的执行方式。

  • 使用索引进行查询

    因为直接使用全表扫描的方式执行查询要遍历好多记录,所以代价可能太大了。如果查询语句中的搜索条件可以使用到某个索引,那直接使用索引来执行查询可能会加快查询执行的时间。使用索引来执行查询的方式五花八门,又可以细分为许多种类:

    • 针对主键或唯一二级索引的等值查询
    • 针对普通二级索引的等值查询
    • 针对索引列的范围查询
    • 直接扫描整个索引

设计MySQL的大叔把MySQL执行查询语句的方式称之为访问方法或者访问类型。下边细细道来各种访问方法的具体内容。

先创建一个表

CREATE TABLE single_table (id INT NOT NULL AUTO_INCREMENT,key1 VARCHAR(100),key2 INT,key3 VARCHAR(100),key_part1 VARCHAR(100),key_part2 VARCHAR(100),key_part3 VARCHAR(100),common_field VARCHAR(100),PRIMARY KEY (id), -- 主键KEY idx_key1 (key1), -- 二级索引UNIQUE KEY idx_key2 (key2), -- 唯一二级索引KEY idx_key3 (key3),-- 二级索引KEY idx_key_part(key_part1, key_part2, key_part3) -- 二级联合索引
) Engine=InnoDB CHARSET=utf8;

const

执行主键查询和唯一索引查询使用(查询过程是等值查询,不会出现范围查询)

image_1cthurrlpbhlotsjru1dsjrrl30.png-110.2kB

SELECT * FROM single_table WHERE id = 1438;
SELECT * FROM single_table WHERE key2 = 3841;

ref

根据索引查询时,只有叶节点查询结果是连续的

image_1ctf14vso11cdclsmc6ac8pru9h.png-109.5kB

SELECT * FROM single_table WHERE key_part1 = 'god like';SELECT * FROM single_table WHERE key_part1 = 'god like' AND key_part2 = 'legendary';SELECT * FROM single_table WHERE key_part1 = 'god like' AND key_part2 = 'legendary' AND key_part3 = 'penta kill';SELECT * FROM single_table WHERE key2 IS NULL;

range

根据索引查询时,非叶节点和叶节点查询结果是有范围的

image_1ctf21uu8113m1ajm1rcitgf5eeco.png-122.5kB

SELECT * FROM single_table WHERE key2 IN (1438, 6328) OR (key2 >= 38 AND key2 <= 79);

index

遍历二级索引

-- (key_part1, key_part2, key_part3)组成联合索引
SELECT key_part1, key_part2, key_part3 FROM single_table WHERE key_part2 = 'abc';

all

全表扫描

索引合并

我们前边说过MySQL在一般情况下执行一个查询时最多只会用到单个二级索引,但不是还有特殊情况么,在这些特殊情况下也可能在一个查询中使用到多个二级索引,设计MySQL的大叔把这种使用到多个索引来完成一次查询的执行方法称之为:index merge,具体的索引合并算法有下边三种。

合并的前提是索引返回的主键值是有序的

Intersection合并

Intersection为交集

-- 二级索引key1返回的是key1值为'a'的主键值,在B+树中相同索引的排序方式是按主键大小排序,所以二级索引key1返回的主键是有序的,key3同理
SELECT * FROM single_table WHERE key1 = 'a' AND key3 = 'b';SELECT * FROM single_table WHERE key1 = 'a' AND (key_part1 = 'a' AND key_part2 = 'b' AND key_part3 = 'c');SELECT * FROM single_table WHERE id > 100 AND key1 = 'a';

合并过程就是归并排序

不能进行合并

-- 这种情况key1返回的值是无序的
SELECT * FROM single_table WHERE key1 > 'a' AND key_part1 = 'a' AND key_part2 = 'b' AND key_part3 = 'c';-- 联合索引返回的值也是无序的
SELECT * FROM single_table WHERE key1 = 'a' AND key_part1 = 'a';

Union合并

交集

-- 前提也是返回主键有序
SELECT * FROM single_table WHERE key1 = 'a' OR key3 = 'b'SELECT * FROM single_table WHERE key1 = 'a' OR ( key_part1 = 'a' AND key_part2 = 'b' AND key_part3 = 'c');

不能的情况

SELECT * FROM single_table WHERE key1 > 'a' OR (key_part1 = 'a' AND key_part2 = 'b' AND key_part3 = 'c');SELECT * FROM single_table WHERE key1 = 'a' OR key_part1 = 'a';

Sort-Union合并

Union索引合并的使用条件太苛刻,必须保证各个二级索引列在进行等值匹配的条件下才可能被用到,比方说下边这个查询就无法使用到Union索引合并:

SELECT * FROM single_table WHERE key1 < 'a' OR key3 > 'z'

这是因为根据key1 < 'a'idx_key1索引中获取的二级索引记录的主键值不是排好序的,根据key3 > 'z'idx_key3索引中获取的二级索引记录的主键值也不是排好序的,但是key1 < 'a'key3 > 'z'这两个条件又特别让我们动心,所以我们可以这样:

  • 先根据key1 < 'a'条件从idx_key1二级索引中获取记录,并按照记录的主键值进行排序
  • 再根据key3 > 'z'条件从idx_key3二级索引中获取记录,并按照记录的主键值进行排序
  • 因为上述的两个二级索引主键值都是排好序的,剩下的操作和Union索引合并方式就一样了。

并多了一步对二级索引记录的主键值排序的过程。

小贴士:

为啥有Sort-Union索引合并,就没有Sort-Intersection索引合并么?因为并集是两个子集的排序结果,排序前合并还是排序后合并都是一样的,但交集却会舍去一些元素,所以会影响效率

剩下的操作和Union索引合并方式就一样了。

并多了一步对二级索引记录的主键值排序的过程。

小贴士:

为啥有Sort-Union索引合并,就没有Sort-Intersection索引合并么?因为并集是两个子集的排序结果,排序前合并还是排序后合并都是一样的,但交集却会舍去一些元素,所以会影响效率

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

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

相关文章

依赖的多个 jar 中包含了相同类,编译提示 :app:checkDebugDuplicateClasses‘

问题描述 项目依赖了两个 jar 包&#xff0c;并且两个jar 包中包含了路径和名称完全相同的类。编译时报错:app:checkDebugDuplicateClasses‘ 问题分析 大思路就是排除掉 面向 CSDN 编程&#xff0c;网上各种 exclude 方式无效。 面向 Github Copilot 编程&#xff0c; 问&a…

【Machine Learning】Suitable Learning Rate in Machine Learning

一、The cases of different learning rates: In the gradient descent algorithm model: is the learning rate of the demand, how to determine the learning rate, and what impact does it have if it is too large or too small? We will analyze it through the follow…

索引常见面试题

面试中&#xff0c;MySQL 索引相关的问题基本都是一系列问题&#xff0c;都是先从索引的基本原理&#xff0c;再到索引的使用场景&#xff0c;比如&#xff1a; 索引底层使用了什么数据结构和算法&#xff1f;为什么 MySQL InnoDB 选择 Btree 作为索引的数据结构&#xff1f;什…

ProtoBuf-gRPC实践

目录介绍 01.gRPC学习背景 1.1 为什么要学RPC1.2 RPC是什么1.3 网络库收益分析1.4 学习计划说明1.5 学习问题思考 02.ProtoBuf的介绍 2.1 ProtoBuf是什么2.2 ProtoBuf和json2.3 ProtoBuf问题思考2.4 ProtoBuf特点2.5 ProtoBuf存储格式2.6 ProtoBuf优缺点2.7 创建proto文件2.8 …

Oracle等待事件-db file scattered read

上一篇说了下 Oracle等待事件-db file sequential read-CSDN博客 &#xff0c;这一篇说一下它的”孪生兄弟” 另外一个IO 等待事件 db file scattered read(数据库文件分散读) 如果 Oracle 在 SGA 的缓冲区缓存中没有用户请求的数据&#xff0c;则服务器进程会将相应的数据块…

前端学习之css选择器--基本选择器、关系选择器、属性选择器、复合选择器、伪类选择器

目录 基本选择器 结果 关系选择器 结果 父子关系 祖先后代关系 相邻兄弟关系 兄弟关系 ​编辑 属性选择器 结果 复合选择器 结果 伪类选择器 结果 伪类选择器-操作标签 结果 未访问 访问后 悬停 伪类选择器-操作表单 结果 伪类选择器-操作结构 结果 基本选择…

二叉树详解

二叉树详解 一:什么是树1:概念2:树的特点##3:树的一些重要概念 二:二叉树1:二叉树的概念2:二叉树的特点3:特殊的二叉树: 三:二叉树的性质四:二叉树的存储 一:什么是树 1:概念 树是一种非线性的数据结构,它是由n个节点组成的一个具有层次关系的集合,把它叫做树的原因是因为它看…

【网络原理】HTTP协议和使用Fiddler抓包

文章目录 &#x1f343;HTTP协议是什么&#xff1f;&#x1f340;理解 "应用层协议"&#x1f38d;HTTP 协议的工作过程&#x1f334;HTTP 协议格式&#x1f333;Fiddler抓包工具的使用&#x1f338;如何抓HTTPS的包&#xff1f; &#x1f38b;抓包工具的原理&#x1…

Vue2 和Vue3 双向数据绑定的区别和原理

Vue 2 和 Vue 3 的双向数据绑定原理基本相同&#xff0c;都是基于 JavaScript 的特性实现的&#xff0c;但在实现细节上有一些区别。 在 Vue 2 中&#xff0c;双向数据绑定是通过 Object.defineProperty 实现的。Vue 2 会使用 Object.defineProperty 为数据对象的每个属性创建…

Transformer的前世今生 day04(ELMO、Attention注意力机制)

ELMO 前情回顾 NNLM模型&#xff1a;主要任务是在预测下一个词&#xff0c;副产品是词向量Word2Vec模型&#xff1a;主要任务是生成词向量 CBOW&#xff1a;训练目标是根据上下文预测目标词Skip-gram&#xff1a;训练目标是根据目标词预测上下文词 ELMO模型的流程 针对Wor…

矩形相交问题

给出左下和右上的坐标&#xff0c;判断矩形是否相交&#xff0c;并求出相交的区域 思路&#xff1a;从矩形中点间的横纵坐标距离判断 矩形A&#xff1a;左下坐标&#xff08;A1&#xff0c;A2&#xff09;右上坐标&#xff08;A3&#xff0c;A4&#xff09; 矩形B&#xff1a;左…

科研学习|论文解读——了解在线环境中的多数观点形成过程:Facebook的探索性方法(IPM, 2018)

论文标题 Understanding the majority opinion formation process in online environments: An exploratory approach to Facebook 摘要 在在线社区的社会互动过程中,多数观点经常被观察到,但很少有研究用实证数据来解决这一问题。为了确定一个合适的理论视角来解释在…

软件推动开放自动化落地

当你唯一拥有的是一把锤子时&#xff0c;你周围的一切都是钉子。 软件是硬件设备的护城河&#xff0c;国际自动化厂商不遗余力地开发各种新型工业软件&#xff0c;其战略站在应用的制高点。以前我们追求硬件兼容&#xff0c;现在我们要致力于应用引领。如果我们拥有强大的SCADA…

js封装SDK 在VUE、小程序、公众号直接调用js调用后端接口(本文以vue项目为例)

1.封装一个js文件msgSdk.js 注意&#xff1a;需要修改这个请求地址 apiServiceAddress ;(function () {if (window.msgSdk) {return}var msgSdk (function () {var m_msgSdk thisvar apiServiceAddress"http://172.12.14.5:8000"this.I_SendHTTPRequest functi…

Linux账号管理与ACL权限设置

文章目录 Linux的账户和用户组用户标识符&#xff1a;UID与GID用户账号用户组&#xff1a;有效与初始用户组groups&#xff0c;newgrp 账号管理新增与删除用户&#xff1a;useradd、相关配置文件、passwd、usermod、userdel用户功能&#xff1a;id、finger、chfn、chsh新增与删…

HANA VIEW 用 ABAP 创建CDS VIEW,在生成ODATA

这里我们做ADT来创建 场景介绍:把hana中的一个底表,创建成ABAP的 CDS VIEW ,在把CDS VIEW 生成 OData 服务。 一、创建CDS Table Function 红框内根据自身情况填写 选择 Define Table Function with Parameters 创建 Data Definition 完整代码,定义 结构 , 也可以定义参…

Grok ChatLaw

Grok是马斯克旗下的AI公司推出的一款革命性产品&#xff0c;它提供了创新且可靠的数据分析和决策支持平台1。Grok的技术解决方案主要包括以下几个方面&#xff1a; 强大的数据处理能力&#xff1a;Grok能够处理大规模的数据&#xff0c;并从中提取出有价值的信息和洞察。 先进…

centos7安装jdk详细步骤(yum安装与手动安装)

centos7安装jdk详细步骤&#xff08;yum安装与手动安装&#xff09; 一、使用yum安装1. 准备工作2. 检查系统是否自带jdk3. 安装jdk 二、手动安装jdk1. 下载上传jdk2. 安装jdk3. 配置环境变量 一、使用yum安装 1. 准备工作 如果你的机器可以联网可以使用此方法 ping www.baidu…

Java基础学习笔记二

Java的加载与执行 Java既是编译型语言又是解释型语言 question&#xff1a;为什么JVM可以跨平台执行 answer &#xff1a; Java虚拟机&#xff08;JVM&#xff09;之所以能够跨平台执行&#xff0c;是因为它在不同操作系统上提供了一个统一的运行环境&#xff0c;实现了Java程…

‘‘ is not a package AttributeError: module ‘‘ has no attribute ‘__path__‘报错解决

报错&#xff1a; No module named ‘ldm.util’; ‘ldm’ is not a package AttributeError: module ‘ldm’ has no attribute ‘__ path__’ 原因&#xff1a; 1.首先这个引用没有被画横线&#xff0c;说明包存在&#xff0c;并且也在包目录底下添加了__init__.py文件 &am…