MySQL 索引相关问题,建议搭建好环境,真实操作一下索引应用到的各种场景

news2024/12/26 0:04:18

文章目录

  • 什么是 B-tree 和 B+tree ?
  • B-Tree 和 B+Tree的区别?
  • MySQL 联合唯一索引是B+Tree,会带来什么原则?
  • 主键索引和单字段唯一索引有什么区别吗
  • 什么是 聚簇索引和非聚簇索引 ?
  • 创建一个三百万数据量的表格,方便测试索引

什么是 B-tree 和 B+tree ?

MySQL索引是一种用于加快数据库查询速度的数据结构。B-tree(B树)和B+tree(B+树)是两种常见的索引结构,用于组织和管理索引数据。
B+树(B+ tree)和B树(B-tree)是常用的数据结构,用于在数据库和文件系统中进行索引和存储数据。
B树和B+树都是平衡二叉树,它们都用于数据库索引。
image.png
image.png
需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针
总体而言,B+树比B树更适合用于数据库索引。MySQL的索引就是基于B+树的。

B-Tree 和 B+Tree的区别?

B 树& B+树两者有何异同呢?

  • B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。
  • B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
  • B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。
  • 在 B 树中进行范围查询时,首先找到要查找的下限,然后对 B 树进行中序遍历,直到找到查找的上限;而 B+树的范围查询,只需要对链表进行遍历即可。

综上,B+树与 B 树相比,具备更少的 IO 次数、更稳定的查询效率和更适于范围查询这些优势。

MySQL 联合唯一索引是B+Tree,会带来什么原则?

组合索引 和 B+Tree =》 最左匹配原则
MySQL的最左匹配原则是指在使用组合索引时,MySQL会优先使用索引中的最左边的列进行匹配,然后再逐渐向右匹配其他列。这个原则对于查询的索引选择和效率有重要影响,需要注意以下几点:

  1. 最左前缀匹配:MySQL只能使用索引中的最左前缀进行匹配。也就是说,如果一个查询只使用了组合索引中的一部分列,那么只有这部分列的索引会被使用,而后面的列不会被利用到。因此,在设计组合索引时,需要根据查询的常见模式和条件,将最常用的列放在索引的最左边。
  2. 索引顺序组合索引的列顺序非常重要。如果查询中的列不是按照索引的顺序进行匹配,那么MySQL将无法使用索引,而是进行全表扫描。因此,需要根据查询的条件和排序方式,将最常用的列放在索引的最左边。
  3. 范围查询:如果查询中包含范围查询(例如大于、小于、区间等),那么只有范围查询之前的列才能被索引使用。范围查询之后的列将无法使用索引,因此需要根据查询的范围条件,将最常用的列放在范围查询之前。
  4. 索引覆盖:如果查询只需要使用组合索引中的列,而不需要访问主索引或数据页,那么可以避免额外的IO操作,提高查询效率。因此,在设计组合索引时,可以考虑将常用的查询列放在索引的最左边,以实现索引覆盖。

需要注意的是,最左匹配原则只适用于组合索引,而不适用于单列索引。在实际使用中,需要根据具体的查询模式和数据特点,合理设计索引,以提高查询效率和性能。

主键索引和单字段唯一索引有什么区别吗

主键索引和单字段唯一索引在功能和使用上有一些区别,下面是它们的主要区别:

  1. 主键索引(Primary Key Index):
    • 主键索引是用于唯一标识表中每一行数据的索引,每个表只能有一个主键索引
    • 主键索引可以由一个或多个列组成,但通常是由单个列组成
    • 主键索引的值不能为NULL,且必须是唯一的
    • 主键索引在数据库中自动创建,可以加速数据的查找和连接操作。
    • 主键索引通常是聚簇索引,即数据按照主键的顺序存储在磁盘上。
  2. 单字段唯一索引(Unique Index):
    • 单字段唯一索引是用于确保表中某个列的值是唯一的索引
    • 单字段唯一索引可以由一个或多个列组成,但通常是由单个列组成
    • 单字段唯一索引的值可以为NULL,但是如果有多行数据的索引列的值为NULL,则不会违反唯一性约束
    • 单字段唯一索引在数据库中需要显式创建。
    • 单字段唯一索引可以加速数据的查找和连接操作,同时确保索引列的值是唯一的。

什么是 聚簇索引和非聚簇索引 ?

聚簇索引和非聚簇索引的主要区别在于它们的数据存储方式。
聚簇索引是将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据。这意味着聚簇索引的叶子节点就是数据节点,每个叶子节点包含了行的全部信息。使用聚簇索引查询数据时,只需要查找索引就可以找到数据,因为数据和索引是在同一个物理结构中。
非聚簇索引则将数据与索引分开存储。索引结构的叶子节点指向了数据对应的位置。这意味着非聚簇索引的叶子节点不包含行的全部信息,而是包含了数据的位置信息。使用非聚簇索引查询数据时,需要先查找索引找到数据的位置,然后再通过位置信息找到实际的数据。

image.png

创建一个三百万数据量的表格,方便测试索引

假设,有一个订单表格,2023.11.25 这一天有300w数据量存储到表格,内容可以如下:

# 创建一个简单的订单表
drop table if exists `co_order`;
CREATE TABLE `co_order` (
  `co_num` varchar(100) NOT NULL COMMENT '订单ID',
  `status` char(2) NOT NULL DEFAULT '10' COMMENT '订单状态:10新建,15取消,20已支付,30已完成',
  `crt_date` char(8) DEFAULT NULL COMMENT '创建日期',
  `crt_user_id` varchar(50) DEFAULT NULL COMMENT '用户名ID',
  `crt_user_name` varchar(50) DEFAULT NULL COMMENT '用户名',
  `product_id` varchar(50) COMMENT '商品ID',
  `product_name` varchar(50) COMMENT '商品名称',
  `amt_sum` decimal(18,2) DEFAULT '0.00' COMMENT '金额',
  PRIMARY KEY (`co_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# 查看 函数是否打开,OFF代表关闭,ON代表已打开
show variables like '%func%';

# 如果是OFF,则输入:
set global log_bin_trust_function_creators=1;

# 删除已经存在的函数
drop function if exists add_order_num;

# 向co_order添加三百万条数据
DELIMITER ;;  
CREATE FUNCTION add_order_num() RETURNS INT
BEGIN
   DECLARE num INT DEFAULT 1000000;
   DECLARE i INT DEFAULT 0;
   WHILE i<num DO
   INSERT INTO co_order (`co_num`,`status`,`crt_date`,`crt_user_id`,`crt_user_name`,`product_id`,`product_name`,`amt_sum`) VALUES 
   (UUID(),'10','20231125',CONCAT('zhangsan',i),CONCAT('张三',i),CONCAT('zhangsanproduct',i),CONCAT('张三商品',i),FLOOR(RAND()*100)),
   (UUID(),'20','20231125',CONCAT('lisi',i),CONCAT('李四',i),CONCAT('lisiproduct',i),CONCAT('李四商品',i),FLOOR(RAND()*100)),
   (UUID(),'30','20231125',CONCAT('wangwu',i),CONCAT('王五',i),	CONCAT('wangwuproduct',i),CONCAT('王五商品',i),FLOOR(RAND()*100));
   SET i = i+1;
   END WHILE;
   RETURN i;
END;
DELIMITER ;

# 执行add_order_num函数
select add_order_num();

# 查看数据信息
select * from co_order;
# 查看数量
select count(*) from co_order;

💡Tips:这样就有了一个存储百万级别量的表格,方便复习测试索引相关的内容知识。

根据自己对比参考一下,加索引 以及 不加索引 效率提升,以及索引个别失效情况等等。

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

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

相关文章

邮政快递查询,邮政快递单号查询,用表格导出查询好的物流信息

批量查询邮政快递单号的物流信息&#xff0c;以表格的形式导出查询好的物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界…

GNSS介绍

GNSS介绍 1. GNSS概述2 GNSS工原理3 GNSS的关键技术3.1 RTK技术3.2 惯性导航技术 4 GPS导航电文的格式4.1 第一数据块4.2 第二数据块4.3 第三数据块 5 NMEA语句5.1 GGA5.2 GSA5.3 GSV5.4 RMC5.5 GLL5.6 VTG 6 各导航系统不同频段的工作频率7 LTE&#xff0c;GNSS&#xff0c;WI…

C语言,通过数组实现循环队列

实现循环队列最难的地方就在于如何判空和判满&#xff0c;只要解决了这两点循环队列的设计就没有问题。接下来我们将会使用数组来实现循环队列。 接下来&#xff0c;为了模拟实现一个容量为4的循环队列&#xff0c;我们创建一个容量为4 1 的数组。 接下来我们将会对这个数组…

ACL权限

ACL权限 目录&#xff1a; 1. 什么是ACL 2. 操作步骤 1. 什么是ACL ACL是Access Control List的缩写&#xff0c;即访问控制列表 每个项目成员在有一个自己的项目目录&#xff0c;对自己的目录有完全权限 项目组中的成员对项目目录也有完全权限 其他人对项目目录没有…

Selenium技巧大揭秘:动态数据、分页和Cookie的获取利器

背景&#xff1a; ​ 昨天我们讲了讲关于seleium的一些基础操作&#xff0c;今天讲讲如何将seleium和爬虫结合起来&#xff0c;可以使用selenium获取网页的动态加载数据&#xff0c;可以使用selenium获得cookie&#xff0c;这两个是比较常用的。我将一一展开。 实战案例&…

SAP Smartforms打印报错Error in spool C call : spool overflow

处理方式&#xff1a; SAP打印时提示&#xff1a; Error in spool C call : spool overflow (假脱机请求溢出&#xff0c;通俗一点打印池已满) 解决办法&#xff1a; SE38 首先运行程序RSPO1041 再运行RSPO1043&#xff0c;话不多说上图。

2023-11-24 LeetCode每日一题(统计和小于目标的下标对数目)

2023-11-24每日一题 一、题目编号 2824. 统计和小于目标的下标对数目二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target &#xff0c;请你返回满足 0 < i < j < n 且 nums[i] nums[j] < targe…

千梦网创:我回来了

最近小半年将近有5个月的时间基本没有更新什么大型的课程内容&#xff0c;朋友圈除了晨记没有频繁更新一些公告或者是动态&#xff0c;直到目前为止&#xff0c;我也才算把手头所有的事情全部梳理好&#xff0c;正式恢复更新状态。 这小半年发生了很多事情&#xff0c;有快乐的…

【数字图像处理】均值滤波与中值滤波

在数字图像处理中,均值滤波和中值滤波是常见的空间域处理方法,可以用于过滤图像中的噪声。本文主要介绍数字图像均值滤波与中值滤波的基本原理,并记录在紫光同创 PGL22G FPGA 平台的布署与实现过程。 目录 1. 均值滤波与中值滤波 2. FPGA 布署与实现 2.1 功能与指标定义

NX二次开发UF_CURVE_ask_int_parms 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_int_parms Defined in: uf_curve.h int UF_CURVE_ask_int_parms(tag_t int_curve_object, int * num_objects_set_1, tag_t * * object_set_1, int * num_objects_set_…

excel一个单元格换行方法

要是在同一个单元格内输入文字输入不下的话&#xff0c;我们是可以进行同一个单元格换行设置的&#xff0c;而且换行的方法也是有很多种&#xff0c;下面我们就一起来看一下有哪些方法吧。 excel一个单元格换行方法&#xff1a; 方法一&#xff1a; 1、我们可以直接按下alte…

2-10岁女童穿搭 I 看的见的时尚感

分享女儿的时尚穿搭—连帽加绒卫衣 简单易搭怎么穿都好看的卫衣 红色吸睛又显肤色&#xff0c;不挑人穿 面料亲肤柔软&#xff0c;保暖性也很棒 单穿内搭都能轻松打造时尚造型&#xff01;&#xff01;

bop数据合并到COCO

bop数据合并到COCO JSON转TXT重命名txt文件中类别信息的转换 JSON转TXT import json import os,globcategories [{"id": 12,"name": "OREO","supercategory": "icbin"},{"id": 16,"name": "Paper…

Tdlib make 卡住

在VM下&#xff0c;用debian编译Tdlib不成功&#xff0c;分析出Tdlib编译会消耗大量的CPU和内存 解决方案&#xff1a;1.增加硬件配置 2.参考 zelenin/go-tdlib: Go wrapper for TDLib (Telegram Database Library) (github.com) 这里参考2&#xff1a;通过说明文件&#xff0…

基于斑马算法优化概率神经网络PNN的分类预测 - 附代码

基于斑马算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于斑马算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于斑马优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

C语言 - 基础

C 语言 1. Hello World #include <stdio.h>int main(int argc, const char *argv[]) {printf("hello world\n");return 0; }注意: 所有的标点符号必须在英文状态下输入单词不要写错注意空格 创建 C语言 程序步骤&#xff1a; 1、创建一个文档&#xff0c;以…

【MinIO】几个有用的方法

在windows总安装Minio 这是一篇不错的安装指南 进入网址 在Windows安装时&#xff0c;选择相应的exe文件下载&#xff0c;下载到本地后&#xff0c;使用如下的命令即可在前台启动&#xff1a; minio.exe server D:\your_path 或者将该路径写进环境变量的path中&#xff0c;…

新手如何买卖基金,基金投资基础入门

一、教程描述 本套基金教程&#xff0c;大小2.50G&#xff0c;共有13个文件。 二、教程目录 第01课&#xff1a;基金入门&#xff0c;学会投资其实不难.mp4 第02课&#xff1a;基金分类&#xff0c;琳琅满目清清楚楚.mp4 第03课&#xff1a;以稳取胜&#xff0c;稳健基金稳…

CSS水平居中与垂直居中的方法

当我们页面布局的时候&#xff0c;通常需要把某一个元素居中&#xff0c;这一篇文章为大家介绍一下居中的几种方法&#xff0c;本人文笔有限&#xff0c;请见谅&#xff01; 一.水平居中 行内元素水平居中的方法&#xff0c;我们使用text-align:center; <!DOCTYPE html&g…

市场被套牢,没有了解积累和分配,昂首资本一一介绍

很多投资者对市场中的积累和分配的概念不是很清楚&#xff0c;下面昂首资本将一一介绍。 积累意味着尽可能多地买入筹码&#xff0c;而不大幅抬高价格&#xff0c;直到在你买入时的价格水平上没有或几乎没有筹码。这种买入通常发生在市场熊市之后&#xff0c;此时有最佳买入价…