实用指南:数据库造神计划第十七天---索引(2)

news/2025/9/22 16:10:56/文章来源:https://www.cnblogs.com/yxysuanfa/p/19105460

 个人主页:寻星探路

作者简介:Java研发方向学习者

个人专栏:、《

⭐️人生格言:没有人生来就会编程,但我生来倔强!!!



目录

 一、B+在MySQL索引中的应用

1、计算三层树高的B+树可以存放多少条记录

二、索引分类

1、主键索引

2、普通索引

3、唯⼀索引

4、全文索引

5、聚集索引

6、非聚集索引

7、索引覆盖

三、使用索引

1、自动创建

2、手动创建

2.1主键索引

2.2唯⼀索引

2.3普通索引

3、创建复合索引

4、查看索引

5、删除索引

5.1主键索引

5.2其他索引

6、创建索引的注意事项


续接上一话:

 一、B+在MySQL索引中的应用

        非叶子节点保存索引数据,叶子节点保存真实数据,如下图所示

以查找id为5的记录,完整的检索过程如下:

        首先判断B+树的根节点中的索引记录,此时 5 < 7 ,应访问左孩子节点,找到索引页2

        在索引页2中判断id的大小,找到与5相等的记录,命中,加载对应的数据页

以上的IO过程,加载索引页1-->加载索引页2-->加载数据页3

1、计算三层树高的B+树可以存放多少条记录

(了解一些计算,要有一点基本的估算能力)

        假设⼀条用户数据大小为1KB,在忽略数据页中数据页自⾝属性空间占用的情况下,一页可以存16 条数据

        索引页一条数据的大小为,主键用BIGINT类型占8Byte,下一页地址6Byte,⼀共是14Byte,⼀个索引页可以保存 16*1024/14 = 1170 条索引记录

        如果只有三层树高的情况,综合只保存索引的根节点和⼆级节点的索引页以及保存真实数据的数据页,那么⼀共可以保存 1170*1170*16 = 21,902,400 条记录,也就是说在两千多万条数据的 表中,可以通过三次IO就完成数据的检索

二、索引分类

1、主键索引

        当在⼀个表上定义⼀个主键 PRIMARY KEY 时,InnoDB使用它作为聚集索引。

        推荐为每个表定义⼀个主键。如果没有逻辑上唯一且非空的列或列集可以使用主键,则添加⼀个自增列。

2、普通索引

        最基本的索引类型,没有唯⼀性的限制。

        可能为多列创建组合索引,称为复合索引或组全索引

3、唯⼀索引

        当在⼀个表上定义⼀个唯⼀键 UNQUE 时,自动创建唯⼀索引。

        与普通索引类似,但区别在于唯⼀索引的列不允许有重复值。

4、全文索引

        基于文本列(CHAR、VARCHAR或TEXT列)上创建,以加快对这些列中包含的数据查询和DML操作

        用于全文搜索,仅MyISAM和InnoDB引擎支持。

5、聚集索引

        与主键索引是同义词

        如果没有为表定义 PRIMARY KEY, InnoDB使用第⼀个 UNIQUE 和 NOT NULL 的列作为聚集索引。

        如果表中没有PRIMARY KEY 或合适的 UNIQUE 索引,InnoDB会为新插入的行生成⼀个行号并用6字节的ROW_ID 字段记录, ROW_ID 单调递增,并使用ROW_ID 做为索引。

6、非聚集索引

        聚集索引以外的索引称为非聚集索引或⼆级索引

        ⼆级索引中的每条记录都包含该行的主键列,以及⼆级索引指定的列。

        InnoDB使用这个主键值来搜索聚集索引中的行,这个过程称为回表查询

7、索引覆盖

        当⼀个select语句使用了普通索引且查询列表中的列刚好是创建普通索引时的所有或部分列,这时就可以直接返回数据,而不用回表查询,这样的现象称为索引覆盖

三、使用索引

1、自动创建

        当我们为⼀张表加主键约束(Primarykey),外键约束(ForeignKey),唯⼀约束(Unique)时, MySQL会为对应的的列自动创建⼀个索引

        如果表不指定任何约束时,MySQL会自动为每⼀列生成⼀个索引并用ROW_ID 进行标识

2、手动创建

2.1主键索引

# ⽅式⼀,创建表时创建主键
create table t_test_pk (
id bigint primary key auto_increment,
name varchar(20)
);
# ⽅式⼆,创建表时单独指定主键列
create table t_test_pk1 (
id bigint auto_increment,
name varchar(20),
primary key (id)
);
# ⽅式三,修改表中的列为主键索引
create table t_test_pk2 (
id bigint,
name varchar(20)
);
alter table t_test_pk2 add primary key (id) ;
alter table t_test_pk2 modify id bigint auto_increment;

2.2唯⼀索引

# ⽅式⼀,创建表时创建唯⼀键
create table t_test_uk (
id bigint primary key auto_increment,
name varchar(20) unique
);
# ⽅式⼆,创建表时单独指定唯⼀列
create table t_test_uk1 (
id bigint primary key auto_increment,
name varchar(20),
unique (name)
);
# ⽅式三,修改表中的列为唯⼀索引
create table t_test_uk2 (
id bigint primary key auto_increment,
name varchar(20)
);
alter table t_test_uk2 add unique (name) ;

2.3普通索引

# ⽅式⼀,创建表时指定索引列
create table t_test_index (
id bigint primary key auto_increment,
name varchar(20) unique
sno varchar(10),
index(sno)
);
# ⽅式⼆,修改表中的列为普通索引
create table t_test_index1 (
id bigint primary key auto_increment,
name varchar(20),
sno varchar(10)
);
alter table t_test_index1 add index (sno) ;
# ⽅式三,单独创建索引并指定索引名
create table t_test_index2 (
id bigint primary key auto_increment,
name varchar(20),
sno varchar(10)
);
create index index_name on t_test_index2(sno);

3、创建复合索引

        创建语法与创建普通索引相同,只不过指定多个列,列与列之间用逗号隔开

# ⽅式⼀,创建表时指定索引列
create table t_test_index4 (
id bigint primary key auto_increment,
name varchar(20),
sno varchar(10),
class_id bigint,
index (sno, class_id)
);
# ⽅式⼆,修改表中的列为复合索引
create table t_test_index5 (
id bigint primary key auto_increment,
name varchar(20),
sno varchar(10),
class_id bigint
);
alter table t_test_index5 add index (sno, class_id);
# ⽅式三,单独创建索引并指定索引名
create table t_test_index6 (
id bigint primary key auto_increment,
name varchar(20),
sno varchar(10),
class_id bigint
);
create index index_name on t_test_index6 (sno, class_id);

4、查看索引

# ⽅式⼀:show keys from 表名
show keys from t_test_index6;

# ⽅式⼆
show index from t_test_index6;
# ⽅式三,简要信息:desc 表名;
desc t_test_index6;

5、删除索引

5.1主键索引

# 语法
alter table 表名 drop primary key;
# 示例,删除t_test_index6表中的主键
alter table t_test_index6 drop primary key;

# 如查提⽰由于⾃增列的错误,先删除⾃增属性
alter table t_test_index6 modify id bigint;

# 重新删除主键
alter table t_test_index6 drop primary key;

# 查看结果
show keys from t_test_index6;

5.2其他索引

# 语法alter table 表名 drop index 索引名;
# ⽰例,删除t_test_index6表中名为index_name的索引
alter table t_test_index6 drop index index_name;
# 查看结果
show keys from t_test_index6;

6、创建索引的注意事项

        索引应该创建在高频查询的列上

        索引需要占用额外的存储空间

        对表进行插入、更新和删除操作时,同时也会修索引,可能会影响性能 

        创建过多或不合理的索引会导致性能下降,需要谨慎选择和规划索引

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

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

相关文章

邀您参加丨云栖大会中企出海技术分论坛

【云栖大会中企出海技术分论坛专场】 🌍 全球布局,技术先行!中国企业全球化正当时 🌏 2025 年 9 月 25 日 上午 9:30-12:20 📍 阿里云云栖小镇 D2-2 馆丨“ 中企出海技术分论坛” 即将启幕! 面对全球市场机遇…

汉中专业做网站wordpress选项下拉

在了解过世界最大的PHP站点&#xff0c;Facebook的后台技术后&#xff0c;今天我们来了解一个百万级PHP站点的网站架构&#xff1a;Poppen.de。Poppen.de是德国的一个社交网站&#xff0c;相对Facebook、Flickr来说是一个很小的网站&#xff0c;但它有一个很好的架构&#xff0…

h5案例排名轻松seo 网站推广

/任务 5 有三位老师&#xff0c;王老师&#xff0c;孙老师和小李老师&#xff0c; 王老师工龄最长(15年)&#xff0c;孙老师工龄比王老师小3年&#xff0c; 小李老师工龄最短&#xff0c;是王老师和孙老师工龄和的二分之一 再除以2的余数正好是他的工龄&#xff0c;编写程序从控…

asp网站 攻击网站设计基本功能

当涉及到虾皮&#xff08;Shopee&#xff09;接口的时&#xff0c;我们需要注意的是虾皮提供了API供开发者使用以集成其平台功能。然而&#xff0c;由于API的具体细节、参数和认证机制可能会随时间变化&#xff0c;以下是一个简化的示例和步骤&#xff0c;用于说明如何与虾皮AP…

网站成立时间商家怎么入驻微信小程序

环境&#xff1a; windows xp sp3 工具&#xff1a; bjanes.2&#xff0c;HashCalc 这个和14题是一样的&#xff0c;看名字就发现都是2.0A&#xff0c;然后用HashCalc来计算一下MD5&#xff0c;发现它们的值是相同的。 如果没猜错&#xff0c;应该就是在14题是被放错题了。

非物质文化遗产网站怎么做网站用户反馈

一、什么是CountDownLatch CountDownLatch中count down是倒数的意思&#xff0c;latch则是门闩的含义。整体含义可以理解为倒数的门栓。 CountDownLatch的作用也是如此&#xff0c;在构造CountDownLatch(int count)&#xff1a;的时候需要传入一个整数count&#xff0c;在这个…

百中搜网站建设wordpress字菜单

人在这世上是无法独自生存的。因为学校和社会都是由众多人所组成。——绫小路清隆 首先&#xff0c;从生物学的角度看&#xff0c;人类作为社会性动物&#xff0c;天生就具有与他人互动和合作的本能。无论是在原始社会还是现代文明中&#xff0c;人类都需要通过集体合作来确保生…

萧县做网站微信公众号跳转的网页怎么制作

客户介绍 某科技股份有限公司作为一家在金融科技行业有着20余年经验的公司&#xff0c;见证了金融科技行业的电子化、信息化、移动化和数字化的发展进程。该公司致力于为金融机构提供领先的产品和专业化服务&#xff0c;其业务涵盖应用软件开发、系统集成、IT服务和IT咨询服务…

压测指标和结果分析

压测指标 压测结果分析 一、数据库死锁 1、吞吐量(TPS/QPS)突然暴跌或维持低位现象:曲线图上出现断崖式下跌,或者吞吐量无论如何增加压力(并发用户数)都无法继续上升,维持在一个很低的水平。 原因:发生死锁后,…

指令流水线

1.分析每个阶段的微操作序列 2,写出对于的机器指令和微操作命令一集节拍安排 ​ 写出每个周期苏哦需要的微操作(参考硬布线) ​ 补充为程序控制器特有的微操作 ​ a取址周期 ​ A d(CMDR)->CMAR ​ OP(IR)-&g…

nuget控制台乱码的解决办法

在nuget控制台执行如下命令: [Console]::OutputEncoding = [System.Text.Encoding]::UTF8作者:xuejianxiyang出处:http://xuejianxiyang.cnblogs.com关于作者:Heaven helps those who help themselves.本文版权归原…

完整教程:Android 自定义电池组件(BatteryView)

完整教程:Android 自定义电池组件(BatteryView)2025-09-22 16:03 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

安阳信息港网站wordpress翻译配置

在之前的博客中&#xff0c;我们使用Thymeleaf&#xff0c;Bower和Bootstrap构建了登录页面&#xff0c;并将其部署到了Heroku。 在此博客中&#xff0c;我们将介绍用于前端的AngularJS和在后端的Spring Boot Web服务的一些功能。 我们将从“登录/注销”部分开始。 让我们开始…

关于音乐的个人网站搜索排名优化公司

目录 第一章 引言 第二章 数据准备 第三章 贝叶斯路径规划模型训练 第四章 路径规划预测 第五章 路径执行 第六章 实验结果分析 第一章 引言 自动驾驶技术的发展带来了自动驾驶车辆的出现&#xff0c;而路径规划作为自动驾驶车辆的关键功能之一&#xff0c;对于确定最佳行…

网站关键词设置多少个深圳建筑公司排名前二十

视频生成模型&#xff0c;如 Stable Video Diffusion 和 Videocrafter&#xff0c;已经能够生成合理且高分辨率的视频。但这些技术进步也带来了被恶意利用的风险&#xff0c;比如用于制造假新闻或进行政治宣传。因此&#xff0c;来自弗吉尼亚大学和亥姆霍兹信息安全中心&#x…

网站 建设方案合肥市建设建筑网站

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131901444 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

摄影作品展示网站flash全站源码长沙app开发公司排名

目录 引言 1 导入数据集 2 清洗数据集 3 确定允许的最大序列长度 4 选择合理的文本和摘要 5 对文本进行标记 6 删除空文本和摘要 7 构建模型 7.1 编码器 7.2 解码器 8 训练模型 9 测试模型 10 注意 11 整体代码 引言 文本摘要是指在捕捉其本质的同时缩短长文本的…

中文乱码速查表

从小红书贴过来的,自己保存看。侵删。为了自己能看到乱码快快解决。

使用PySide6/PyQt6实现全国省市区的级联选择组件

使用PySide6/PyQt6实现全国省市区的级联选择组件在基于BS或者H5实现全国省市区的级联选择组件,相对比较容易,一般都要有现成的封装,如对于移动端H5或者小程序的Vant4界面库,他们直接安装使用内置的数据即可进行调用…

WPF TextBlock effect DropShadrowEffect,BlurEffect

<Window x:Class="WpfApp32.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d=&quo…