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

news2024/11/15 15:51:28

文章目录

  • 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 ,那么就实现了索引覆盖,因为所需的列都在索引中可以直接获取,不需要再根据索引找到数据行获取其他列的值。 这样可以大大提高查询效率。

            

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

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

相关文章

LTrack:实现夜间多目标追踪,并开放低光多目标追踪数据集LMOT

摘要 低光场景在现实应用中很常见(例如,夜间的自动驾驶和监控)。最近,多目标跟踪在各种实际用例中受到了很多关注,但黑暗场景中的多目标跟踪却很少被考虑。在本文中,我们专注于黑暗场景中的多目标跟踪。为…

点菜吧——随便点 C#生成套餐

前言 一到食堂发现有多种选择,但是有一个固定的套路,只能是一个荤,二个小荤,菜品数量也不少,任君选择,如果是一个选择困难症,就有点烦了,所以出品这个自动生成套餐软件。各位老板可…

Mysql原理与调优-InnoDB行记录结构

目录 1.绪论 2.InnoDB的记录格式分类 3.compact格式 3.1 基本组成 3.2 记录额外信息 3.2.1 记录额外信息组成 3.2.2 变成字段长度列表 3.2.3 null值列表 3.2.4 记录头信息 3.3 实际记录 3.3.1 溢出页 3.3.2 varchar最多可以储存多少个字符的数据 4.其他记录格式和c…

配置python的基本环境

python的背景知识 python是咋来的? Python 是一种广泛使用的高级编程语言,由 Guido van Rossum 在1989年底发明,第一个公开发行版发行于1991年。Python 的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进来区分代码块…

tcpdump使用指南

tcpdump 是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有。 tcpdump src 10.5.2.3 and dst port 3389 # 1. 基于IP地址过滤 # 根据源ip进行过滤 $ tcpdump -i eth2 src 192.168.10.100# 根据目标…

sqli-labs靶场练习(1、5-8关)

自己搭建环境啊喂...http://127.0.0.1/sqli-labs-php7-master/ 第一关 1.单引号判断是否存在注入点 /?id1 2.查询列数 ?id1 order by 3-- ?id1 order by 4-- 由此可判断有3列 3.查询用户名和密码分别在哪列 ?id-1 union select 1,2,3 -- 4.查询数据库名称为security ?…

CC2530组网实验-1

1,ZigBee协议栈 协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议的&…

生活一地猫毛,空气还有猫浮毛!宠物空气净化器帮你消除这些烦恼

随着换毛季节的到来,铲屎官们如临大敌,猫咪将它们的毛发洒满每一个角落,仿佛室内下起了毛茸茸的飘雪。对于铲屎官来说,这不仅耗费时间的清理任务,更是一场守护健康的保卫战。为此,采取了许多措施来应对猫咪…

STL中的vector以及简单实现

vector的简单介绍&#xff1a; 头文件&#xff1a; #include<vector> vector是属于STL的一员&#xff0c;虽然vector的英文意思是向量&#xff0c;但是vector就是一个顺序表&#xff1b; 对于vector来说&#xff0c;面对string的设计的复杂和冗余&#xff0c;vector就…

Java毕业设计 基于SSM和Vue的图书馆座位预约系统小程序

Java毕业设计 基于SSM和Vue的图书馆座位预约系统小程序 这篇博文将介绍一个基于SSM框架和Vue开发的图书馆座位预约系统微信小程序&#xff0c;适合用于Java毕业设计。 功能介绍 用户 登录 注册 首页 图片轮播 关于我们 公告信息 图书馆信息 图书馆详情 预约选座 收藏 …

Tkinter Designer:拖拽式加速Python Tkinter GUI开发的神器

引言 在Python的世界里&#xff0c;创建美观且功能强大的图形用户界面&#xff08;GUI&#xff09;向来是开发者的挑战之一。Tkinter&#xff0c;作为Python的内置GUI库&#xff0c;虽然功能强大&#xff0c;但在实际使用中&#xff0c;设计和实现GUI的过程往往耗时且繁琐。Tki…

Linux中信号的处理

进程正在递达某一个信号期间&#xff0c;同类型的信号无法被递达&#xff01;&#xff01;&#xff01; 当当前信号正在被捕捉事&#xff0c;系统会自动将当前信号加入到进程的信号屏蔽字&#xff08;block&#xff09;。 当信号完成捕捉动作&#xff0c;系统又会自动解除对该…

R语言BIOMOD2 及机器学习方法的物种分布模拟与案例分析

BIOMOD2是一个R软件包&#xff0c;用于构建和评估物种分布模型&#xff08;SDMs&#xff09;。它集成了多种统计和机器学习方法&#xff0c;如GLM、GAM、SVM等&#xff0c;允许用户预测和分析物种在不同环境条件下的地理分布。通过这种方式&#xff0c;BIOMOD帮助研究者评估气候…

Linux-理解shell

文章目录 5. 理解shell5.1 shell的类型5.2 交互shell和系统默认shell5.3 安装zsh shell程序5.4 shell的父子关系5.5 命令列表5.6 命令分组5.7 使用命令分组创建子shell5.8 子shell用法5.9 shell的非内建命令和内建命令5.9.1 非内建命令5.9.2 内建命令5.9.3 history和alias命令介…

Cornerstone加载本地Dicom文件第二弹 - Blob篇

&#x1f340; 引言 当我们刚接触Cornerstone或拿到一组Dicom文件时&#xff0c;如果没有ImageID和后台接口&#xff0c;可能只是想简单测试Cornerstone能否加载这些Dicom文件。在这种情况下&#xff0c;可以使用本地文件加载的方法。之前我们介绍了通过node启动服务器请求文件…

cuda pytorch安装详细教程 GPU版

1.先安装anaconda Anaconda 1.1这里用了最简单的方法&#xff0c;后面将pytorch直接安装到base配置下面了。 1.2下载安装&#xff0c;全部勾选。 一定添加文件夹到path中去&#xff0c;否则后面下载pytorch&#xff0c;无法传输。 1.3 通过cmd&#xff0c;输入conda --versio…

CSP-J 模拟题2

如果x大于45&#xff0c;则输出-1 设定一个整数now&#xff0c;他的初始值为9&#xff1b; 当x>now&#xff0c;就x-now&#xff0c;并且now--; 根据解析写代码1&#xff1a; #include <bits/stdc.h> using namespace std; int a[101010]; int main(){int x;cin>…

设计师必备网站,素材、灵感一手抓

设计师都在哪些地方找素材&#xff0c;找灵感&#xff1f;分享8个设计师必备网站&#xff0c;素材免费下载&#xff0c;还能看到很多国内外大神的设计之作&#xff0c;赶紧收藏起来吧~ 1、baotu 包图网_专注原创商用设计图片下载&#xff0c;会员免费设计素材模板独家图库 国内…

QChart笔记7:基于QPolarChart的雷达图、能力图

六边形战士这个词经常听说&#xff0c;用来描述这个词的是六边形雷达图/能力图。在网上搜索如何用QChart实现没有找到&#xff0c;于是就自己研究出一种写法。 先看看效果&#xff1a; 可以用这个图表示游戏中的人物属性&#xff0c;看看我的几个不太厉害的NPC。 在QT自带的实…

STL—容器—list【list的介绍和基本使用】【list的迭代器失效问题】

STL—容器—list list的使用并不难&#xff0c;有了之前使用string和vector的基础后&#xff0c;学习起来并不难。因此这里不在详细的讲解如何使用&#xff0c;而是大致的将其基本接口都熟悉一下 1.list介绍 list的文档介绍 list是可以在常数范围内在任意位置进行插入和删除…