当前位置: 首页 > news >正文

【MySQL】索引——索引的实现、B+ vs B、聚簇索引 VS 非聚簇索引、索引操作、创建索引、查询索引、删除索引

文章目录

  • MySQL
    • 5. 索引的实现
      • 5.1 B+ vs B
      • 5.2 聚簇索引 VS 非聚簇索引
    • 6. 索引操作
      • 6.1 创建主键索引
      • 6.2 创建唯一索引
      • 6.3 创建普通索引
      • 6.4 创建全文索引
      • 6.5 查询索引
      • 6.6 删除索引

MySQL

在这里插入图片描述

  

5. 索引的实现

  因为MySQL和磁盘交互的基本单位为Page(页)。

  MySQL 中要管理很多数据表文件,而要管理好这些文件,就需要 先描述,在组织 ,我们目前可以简单理解成一个个独立文件是有一个或者多个Page构成的。

   MySQL 会默认按照主键给我们的数据进行排序,从上面的Page内数据记录可以看出,数据是有序且彼此关联的。

在这里插入图片描述

  

  数据页与数据页之间通过指针连成双向链表。

  在页模式中,只有一个功能,就是在查询某条数据的时候直接将一整页的数据加载到内存中,以减少硬盘IO次数,从而提高性能。但是,我们也可以看到,现在的页模式内部,实际上是采用了链表的结构。

在这里插入图片描述

  

  但是多个Page彼此使用双链表链接起来,且每个Page内部的数据是基于链表的。那么,查找特定一条记录,也一定是线性查找,效率低。

  针对上面的单页Page,我们引入目录。

  此时给每个数据页建立起对应的目录,就是索引。

在这里插入图片描述
  

  在单表数据不断被插入的情况下, MySQL 会在容量不足的时候,自动开辟新的Page来保存新的数据,然后通过指针的方式,将所有的Page组织起来——给Page也带上目录。

  
在这里插入图片描述

  其实目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是普通页的地址。

  这个就是B+树。

  Page分为目录页和数据页。目录页只放各个下级Page的最小键值。

  查找的时候,自定向下找,只需要加载部分目录页到内存,即可完成算法的整个查找过程,大大减少了IO次数。

  

5.1 B+ vs B

  InnoDB 在建立索引结构管理数据时,其他数据结构不合适的原因如下:

  链表:线性遍历效率低。

  二叉搜索树:可能退化成为线性结构。

  AVL 和红黑树:虽是平衡或近似平衡的二叉结构,但相比多阶 B+树,树整体过高,导致系统与硬盘的 IO Page 交互更多。

  Hash:MySQL 支持但 InnoDB 和 MyISAM 不支持。Hash 算法虽有时查找快(O(1)),但范围查找不行。

  B 树:非叶子节点也存储数据,这会导致在相同大小的磁盘页中,B 树能存储的索引项比 B+ 树少。从而使得 B 树的阶数相对较低,树的高度可能更高,增加了磁盘 I/O 操作的次数。

  B+ 树:非叶子节点只存储索引信息,磁盘页能容纳更多的索引项,进一步降低了树的高度,减少了 I/O 次数,提高了查询性能。

  
数据结构演示
  

B树:
在这里插入图片描述
  

B+树:

在这里插入图片描述

  

5.2 聚簇索引 VS 非聚簇索引

  MyISAM 这种用户数据与索引数据分离的索引方案,叫做非聚簇索引。

  MyISAM 引擎同样使用B+树作为索引结果,叶节点的data域存放的是数据记录的地址。

  其中, MyISAM 最大的特点是,将索引Page和数据Page分离,也就是叶子节点没有数据,只有对应数据的地址。

  

mysql> create table mtest(-> id int primary key,-> name varchar(11) not null-> )engine=MyISAM;

  
在这里插入图片描述
  

在这里插入图片描述

  

  而InnoDB 是将索引和数据放在一起的。

  所以,InnoDB 这种用户数据与索引数据在一起索引方案,叫做聚簇索引。

  当然, MySQL 除了默认会建立主键索引外,我们用户也有可能建立按照其他列信息建立的索引,一般这种索引可以叫做辅助(普通)索引。

  对于 MyISAM ,建立辅助(普通)索引和主键索引没有差别,无非就是主键不能重复,而非主键可重复。

  

mysql> create table itest(-> id int primary key,-> name varchar(11) not null-> )engine=InnoDB;

  
在这里插入图片描述

  
在这里插入图片描述

  

6. 索引操作

6.1 创建主键索引

  (1)在创建表的时候,直接在字段名后指定 primary key。

create table user1(id int primary key, name varchar(30));

  

  (2)在创建表的最后,指定某列或某几列为主键索引。

create table user2(id int, name varchar(30), primary key(id));

  

  (3)创建表以后再添加主键。

create table user3(id int, name varchar(30));alter table user3 add primary key(id);

  

  主键索引的特点:

  一个表中,最多有一个主键索引,当然可以使符合主键。

  主键索引的效率高(主键不可重复)。

  创建主键索引的列,它的值不能为null,且不能重复。

  主键索引的列基本上是int。

  

6.2 创建唯一索引

  (1)在表定义时,在某列后直接指定unique唯一属性。

create table user4(id int primary key, name varchar(30) unique);

  

  (2)创建表时,在表的后面指定某列或某几列为unique

create table user5(id int primary key, name varchar(30), unique(name));

  
  (3)创建表以后再添加。

create table user6(id int primary key, name varchar(30));
alter table user6 add unique(name);

  

  唯一索引的特点:

  一个表中,可以有多个唯一索引。

  查询效率高。

  如果在某一列建立唯一索引,必须保证这列不能有重复数据。

  如果一个唯一索引上指定not null,等价于主键索引。

  

6.3 创建普通索引

  (1)在表的定义最后,指定某列为索引。

create table user8(id int primary key,
name varchar(20),
email varchar(30),
index(name) 
);

  

  (2)创建完表以后指定某列为普通索引。

create table user9(id int primary key, name varchar(20), email
varchar(30));
alter table user9 add index(name); 

  

  (3)创建一个索引名为 idx_name 的索引。

create table user10(id int primary key, name varchar(20), email
varchar(30));
create index idx_name on user10(name);

  

  普通索引的特点:

  一个表中可以有多个普通索引,普通索引在实际开发中用的比较多。

  如果某列需要创建索引,但是该列有重复的值,那么我们就应该使用普通索引。

  

6.4 创建全文索引

  当对文章字段或有大量文字的字段进行检索时,会使用到全文索引。MySQL提供全文索引机制,但是有要求,要求表的存储引擎必须是MyISAM,而且默认的全文索引支持英文,不支持中文。如果对中文进行全文检索,可以使用sphinx的中文版(coreseek)。

  如果使用如下查询方式,虽然查询出数据,但是没有使用到全文索引。

  
在这里插入图片描述

  可以用explain工具看一下,是否使用到索引。

   key为null表示没有用到索引。

  
在这里插入图片描述

  如何使用全文索引呢?
  
在这里插入图片描述

  

  通过explain来分析这个sql语句。
  
在这里插入图片描述

  

6.5 查询索引

  第一种方法: show keys from 表名;

  第二种方法: show index from 表名;

  第三种方法(信息比较简略): desc 表名;

  

6.6 删除索引

  第一种方法-删除主键索引: alter table 表名 drop primary key;

  

  第二种方法-其他索引的删除: alter table 表名 drop index 索引名; 索引名就是show keys from 表名中的 Key_name 字段

mysql> alter table user10 drop index idx_name;

  

  第三种方法方法: drop index 索引名 on 表名

mysql> drop index name on user8

  

  索引创建原则:

  比较频繁作为查询条件的字段应该创建索引。

  唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件。

  更新非常频繁的字段不适合作创建索引。

  不会出现在where子句中的字段不该创建索引。

  

其他概念:

  复合索引:

  复合索引是指基于多个列创建的索引。 例如,在一个表中有 col1、col2 和 col3 列,如果创建了一个复合索引 (col1, col2, col3),那么在查询时可以利用这个索引来提高查询效率。

  

  索引最左匹配原则:

  这是指在使用复合索引进行查询时,必须从索引的最左侧开始匹配。 例如,如果复合索引是 (col1, col2, col3) ,那么查询条件中只有以 col1 开头,或者以 col1 和 col2 开头,或者以 col1、col2 和 col3 开头的查询才能使用到这个复合索引。

  例如,如果有查询语句 WHERE col1 = 1 AND col2 = 2 或者 WHERE col1 = 1 可以使用该复合索引,但 WHERE col2 = 2 则无法使用。

  

  索引覆盖:

  索引覆盖是指查询所需的所有列的数据都可以从索引中直接获取,无需回表查询数据行。

  例如,如果有一个索引 (col1, col2) ,并且查询语句只是 SELECT col1, col2 FROM table ,那么就实现了索引覆盖,因为所需的列都在索引中可以直接获取,不需要再根据索引找到数据行获取其他列的值。 这样可以大大提高查询效率。

            

相关文章:

【MySQL】索引——索引的实现、B+ vs B、聚簇索引 VS 非聚簇索引、索引操作、创建索引、查询索引、删除索引

文章目录 MySQL5. 索引的实现5.1 B vs B5.2 聚簇索引 VS 非聚簇索引 6. 索引操作6.1 创建主键索引6.2 创建唯一索引6.3 创建普通索引6.4 创建全文索引6.5 查询索引6.6 删除索引 MySQL 5. 索引的实现 因为MySQL和磁盘交互的基本单位为Page(页)。 MySQL 中…...

剖析HTML 元素——WEB开发系列02

HTML元素是构成HTML文档结构的基本单位,定义了页面上的不同部分和内容。HTML元素可以包含不同类型的内容,如文本、图片、链接、表格等,每种元素都有其特定的用途和语义。通过组合和嵌套不同的HTML元素,可以创建复杂的网页结构和布…...

影响3D打印零件品质的关键因素探析

随着科技的飞速发展,3D打印技术作为一种革命性的制造方式,正逐渐渗透到各个行业和领域。然而,尽管3D打印技术在设计和制造上带来了前所未有的灵活性和效率,但其零件品质却受到多种因素的复杂影响。本文将从设备性能、材料选择、工…...

Oracle事务是怎么练成的

什么是事务 事务是数据库管理系统执行过程的一个逻辑单位,由一系列有限的数据库操作序列构成,事务必须满足‌ACID属性。ACID理论是数据库中最重要的概念之一,分别代表原子性(Atomicity)、一致性(Consisten…...

线程与多线程(一)

线程与多线程(一) 一、线程1、概念2、示意图3、虚拟地址转换到物理地址4、与进程相比的优点5、与进程相比的缺点6、与进程的关系(1)线程独有(2)共享(3)示意图 二、POSIX线程库三、创…...

连接其他主机上的redis连接不上`telnet: Unable to connect to remote host: Connection refused`

telnet: Unable to connect to remote host: Connection refused 这个错误通常表示目标主机(192.168.8.29)上的服务(6379端口)没有运行,或者主机的防火墙/网络设置阻止了连接。 你可以尝试以下步骤来解决问题&#xf…...

dijkstral算法详解

import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Map;public class test39 {// 定义节点类,表示图中的顶点public static class Node {public int value; // 节点的值,即编号public int in; // 进入…...

创意指南丨AR数学沉浸式空间体验

AR学习种类那么多,哪款最吸引你? 星河造梦坊和Unity联手打造的沉浸式空间AR无疑是其中的佼佼者。 这款应用不仅利用AR技术将抽象的数学概念变得生动有趣,还通过互动体验让学习者仿佛置身于一个充满奇幻色彩的数学世界中。 无论是学生还是教…...

linux文件——深度学习文件fd、文件系统调用

前言:从本片开始正式进入linux文件的学习,本片内容主要是文件的fd。 本篇内容博主将要先带友友回忆C语言中的文件操作接口,然后再过渡到操作系统中的系统调用的学习,最后理解操作系统中的文件操作。 ps:本节内容设计一…...

003集——C#数据类型 及大小端序转换——C#学习笔记

如需得到一个类型或一个变量在特定平台上的准确尺寸,可以使用 sizeof 方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。下面举例获取任何机器上 int 类型的存储尺寸: using System;namespace DataTypeApplication {class Program{…...

结构化输出及其使用方法

在 LLM 应用程序中构建稳健性和确定性 图片来自作者 欢迎来到雲闪世界。OpenAI最近宣布其最新的gpt-4o-2024–08–06模型支持结构化输出。与大型语言模型 (LLM) 相关的结构化输出并不是什么新鲜事——开发人员要么使用各种快速工程技术,要么使用第三方工具。 在本文…...

yolov8人脸识别案例

GitHub - wangWEI201901/YOLOv8-Detection-Project: 🛣️基于YOLOv8的智慧校园人脸识别和公路汽车检测...

成员变量在Java中的定义与使用

成员变量在Java中的定义与使用 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在本文中,我们将详细探讨Java中的成员变量,包括其定义、使用以及各种类型的成员变量示例。 成员…...

Python开发工具PyCharm入门指南 - 用户界面主题更改

JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 界面主题定义了窗口、对话框、按钮和用户界面的所有可视元素的外观…...

TCP网络套接字

一、创建套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); 参数&#xff1a; domain&#xff1a;指定使用的协议族。常见的取值有AF_INET&#xff08;IPv4&#xff09;和AF_INET6&#xff08;IPv6&a…...

Element学习(axios异步加载数据、案例操作)(5)

1、这次学习的是上次还未完成好的恶element案例&#xff0c;对列表数据的异步加载&#xff0c;并渲染展示。 ——>axios来发送异步请求 &#xff08;1&#xff09; &#xff08;2&#xff09;在vue当中安装axios &#xff08;注意在当前的项目目录&#xff0c;并且安装完之后…...

大数据-65 Kafka 高级特性 分区 Broker自动再平衡 ISR 副本 宕机恢复再重平衡 实测

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

html+css+js网页设计 软通动力网站2个页面(带js)首页轮播图+置顶导航

htmlcssjs网页设计 软通动力网站2个页面&#xff08;带js&#xff09;首页轮播图置顶导航 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及…...

【经验分享】ShardingSphere+Springboot-04:自定义分片算法(COMPLEX/STANDARD)

文章目录 3.4 CLASS_BASED 自定义类分片算法3.4.1 复杂分片自定义算法&#xff08;strategyCOMPLEX &#xff09;3.4.2 STANDARD 标准分片自定义算法## 进阶:star: 自定义算法范围查询优化 3.4 CLASS_BASED 自定义类分片算法 3.4.1 复杂分片自定义算法&#xff08;strategyCOM…...

如何设置RabbitMQ和Redis消息队列系统

设置RabbitMQ和Redis作为消息队列系统时&#xff0c;需要分别进行安装、配置和测试&#xff0c;以确保它们能够正常工作并满足你的应用需求。以下是一个基于这两个系统的设置指南&#xff1a; RabbitMQ的设置 1. 安装Erlang 由于RabbitMQ是用Erlang语言编写的&#xff0c;因…...

美业破局:AI智能体如何用数据重塑战略决策(5/6)

摘要&#xff1a;文章深入剖析美业现状与挑战&#xff0c;指出其市场规模庞大但竞争激烈&#xff0c;面临获客难、成本高、服务标准化缺失等问题。随后阐述 AI 智能体与数据驱动决策的概念&#xff0c;强调其在美业管理中的重要性。接着详细说明 AI 智能体在美业数据收集、整理…...

Vue3中computed和watch的区别

文章目录 前言&#x1f50d; 一、computed vs watch✅ 示例对比1. computed 示例&#xff08;适合模板绑定、衍生数据&#xff09;2. watch 示例&#xff08;副作用&#xff0c;如调用接口&#xff09; &#x1f9e0; 二、源码实现原理&#xff08;简化理解&#xff09;1. comp…...

Hive终极性能优化指南:从原理到实战

摘要​&#xff1a;本文系统总结Hive在生产环境的核心调优手段&#xff0c;涵盖执行引擎选择、存储优化、SQL技巧、资源调配及数据倾斜解决方案&#xff0c;附可复用的参数配置与实战案例。 一、执行引擎优化&#xff1a;突破MapReduce瓶颈 ​启用Tez/Spark引擎​ ​优势​&am…...

LVGL手势识别事件无上报问题处理记录

最近在使用LVGL8.3开源库开源UI界面时,碰到使用FB驱动显示UI时,触摸屏手势识别事件接收不到的情况,通过如下调整可以处理该问题: 1、创建Top Object时,不能使用如下语句: lv_obj_t *page_obj = lv_obj_create(lv_scr_act()); 而要使用如下语句: lv_obj_t *page_obj =…...

Langchain学习笔记(十一):Chain构建与组合技巧

注&#xff1a;本文是Langchain框架的学习笔记&#xff1b;不是教程&#xff01;不是教程&#xff01;内容可能有所疏漏&#xff0c;欢迎交流指正。后续将持续更新学习笔记&#xff0c;分享我的学习心得和实践经验。 前言 在LangChain的发展过程中&#xff0c;API设计经历了重…...

智慧零售管理中的客流统计与属性分析

智慧零售管理中的视觉分析技术应用 一、背景与需求 随着智慧零售的快速发展&#xff0c;传统零售门店面临管理效率低、安全风险高、客户体验差等问题。通过视觉分析技术&#xff0c;智慧零售管理系统可实现对门店内人员行为的实时监控与数据分析&#xff0c;从而提升运营效率…...

Dynamics 365 Finance + Power Automate 自动化凭证审核

&#x1f680; Dynamics 365 Finance Power Automate 自动化凭证审核 &#x1f4d1; 目录 &#x1f680; Dynamics 365 Finance Power Automate 自动化凭证审核1. 依赖 &#x1f527;2. 目标 &#x1f3af;3. 系统架构 &#x1f3d7;️4. 凭证审批全流程 &#x1f6e0;️4.1 …...

git commit 执行报错 sh: -/: invalid option

目录 目录 1. 检查 Git 钩子脚本&#xff08;核心步骤&#xff09;2. 临时绕过钩子&#xff08;快速提交&#xff09;3. 修复钩子依赖环境4. 重新初始化 Husky&#xff08;如适用&#xff09;5. 验证用户配置 Tips&#xff1a; 如果是 clone 下来的新项目直接进行 步骤 4 。…...

CMS、G1、ZGC、Shenandoah 的全面对比

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; Java 垃圾回收器从最早的 Serial 一步步演化&#xff0c;如今已经有了多款高性能、低延迟的 GC 垃圾收集器可选&#xff0c;比如 CMS、G1、…...

docker镜像下载到本地,并导入服务器

应用场景 &#xff1a; 本地环境可以连接外网&#xff0c;但服务器连接不了外网&#xff0c;直接用docker pull 命令执行拉起镜像报异常。 1.本地拉取xuxueli/xxl-job-admin:2.2.0及查看所有下载的镜像 docker pull xuxueli/xxl-job-admin:2.2.0 docker images 2.保存镜像到…...