MySQL基础(九):索引

解读MySQL 索引基础 我们完全可以将索引可以看作是书本的目录,通过书本的目录查找对应的章节就会快一些,索引底层数据结构有b树、b+树、红黑树、哈希表、甚至是链表等,对于MySQL而言,无论Innodb还是MyIsam最左匹配原则算是MySQL的一个重点了,它会基于联合索引最左的字段进行排序,例如我们用字段a、b、c创建联合索引,他就会先通过a进行排序,如果a一样比较b,b再一样比较c这样,通过这样的比较机制生成一个有序的索引结构。 阅读详情
  • 本博客是《MySQL基础》系列博客的第九部分,主要介绍MySQL中的索引
  • 本博客既为方便自己查看复习而作,亦为你而作,望能有所裨益
  • 学习交流请联系 April_0911@163.com

基本概念

定义

  • 索引(Index),在MySQL中也叫键(Key),是存储引擎快速找到记录的一种数据结构。
  • 你可以将它形象地比喻为目录之类的东西,能够快速检索出你所需要的东西。

类型

类型关键字简介
普通索引INDEX最基本常用的索引,仅加速查询,没有任何限制
唯一索引UNIQUE唯一索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一
全文索引FULLTEXT仅可以适用于MyISAM引擎的数据表:作用于CHAR、VARCHAR、TEXT数据类型的列
主键索引UNIQUE INDEX一种特殊的唯一索引,不允许有空值,一般是在创建表的时候同时创建主键索引
组合索引INDEX()将几个列作为一条索引进行检索,使用最左匹配原则

索引应用

示例数据表

由于索引是用来加快查询速度的,因此越大型的数据集其查询效率的优势越明显,因此我们需要在原有的数据表的基础上再创建一个新的大型数据表用来学习:
在这里插入图片描述

create table payment1(
payment_id smallint(5) unsigned not null,
country varchar(50) not null,
country_id smallint(5) unsigned not null
)
select payment_id,country,country_id from payment,country;

创建完成后,生成一个大型数据集:
在这里插入图片描述

预备知识

为了能让其效果简洁易懂,也为了方便日后章节的学习,我们在这里就要开始学习如何在命令行使用MySQL了。

  1. 如何在命令行连接数据库见《MySQL基础(一):安装配置》
  2. 显示当前账户下的数据库 show databases
    在这里插入图片描述
  3. 使用某个数据库 use <数据库名>
    在这里插入图片描述
  4. 显示该数据库中的数据表 show tables
    在这里插入图片描述
  5. 在当前数据库下执行相关操作在这里插入图片描述
  6. 查看该表所有的索引 show index from <数据表>
    在这里插入图片描述

创建索引

如前面所示,我们在查询该数据表的时候花了1.49秒,这个时间对于数据库来说已经不算短了,因此我们需要通过创建索引来提高查询效率。
在这里插入图片描述

create index <索引名> on <数据表>(索引字段)

在这里插入图片描述
这时我们可以查询一下所创建的索引:
在这里插入图片描述
如果感觉这样看太别扭,可以在命令后面加下 \G:
在这里插入图片描述
这时我们再来看下查询效率,是不是很惊讶!
在这里插入图片描述

普通索引

添加普通索引的语句除了上面提及的

create index <索引名> on <数据表>(索引字段);

还有

alter table <数据表> add index <索引名>(索引字段);

在这里插入图片描述
在这里插入图片描述
注:还可以在创建表的时候直接添加索引

create table test1(
id int not null,
username varchar(50) not null,
index idx_username(username) -- 添加名为idx_username的索引,索引字段为username
);

在这里插入图片描述

唯一索引

create table test2(
id int not null,
username varchar(50),
unique index idx_username(username)  -- 增加唯一索引
);

在这里插入图片描述


为了测试唯一索引的特性,我们试着往新建的表中插入记录:


insert into test2(id,username) values(1,'xy'); -- 添加数据
insert into test2(id,username) values(1,'xy'); -- 数据唯一插不进去 
insert into test2(id,username) values(1,null); -- 空值不视为唯一值 

在这里插入图片描述

主键索引

create table test3(
id int primary key not null,
username varchar(14),
unique index idx_username(username) -- 添加主键索引
);

在这里插入图片描述


为了测试主键索引的特性,我们试着往新建的表中插入记录:


insert  test3(id,username) values(1,'xy'); -- 添加数据
insert  test3(id,username) values(1,'xy'); -- 数据唯一插不进去 
insert  test3(id,username) values(null,'xy'); -- 空值插不进去

在这里插入图片描述

组合索引

为了更好地展示组合索引,我们创建一个包含多个字段的表:

create table payment2(
payment_id smallint(5) unsigned not null,
language_id tinyint(5) unsigned not null,
store_id tinyint(5) unsigned not null,
index idx_payment_language_store(payment_id,language_id,store_id)
-- 创建组合索引 
)
select payment_id,language_id,store_id from payment,language,store;

除了在创建表的时候直接添加索引,也可以后续自行添加

create index idx_payment_language_store 
on payment2(payment_id,language_id,store_id); 
-- 创建组合索引 

为了测试组合索引的特性,即最左匹配原则,我们可以这样做:


explain select * from payment2 where payment_id=1 and 
language_id=1 and store_id=2; 
-- 所有字段均参与查询
explain select * from payment2 where payment_id=1 and language_id=1; 
-- 去掉store_id字段
explain select * from payment2 where payment_id=1 and store_id=2;
-- 去掉language_id字段
explain select * from payment2 where language_id=1 and store_id=2;
-- 去掉payment_id字段
/* 显示查询的具体信息 组合索引遵循最左匹配原则 */

在这里插入图片描述
观察上图,细细品味何谓最左匹配原则吧 😃

修改索引

就我目前的知识而言,如果想修改索引的话只能先删除当前索引,再创建新的索引
(如果有哪位兄弟姐妹知道其他方法,请告诉小弟一声,感激不尽)

删除索引

  • drop index <索引名> on <数据库>.<数据表>
    在这里插入图片描述
  • alter table <数据库>.<数据表> drop index <索引名>
    在这里插入图片描述
MySQL进阶【九】—— MySQL查询优化器是如何选择索引的 MySQL查询优化器是如何选择索引的 MySQL的查询优化器,具有非常强大的功能,那MySQL的查询优化器是如何选择索引的呢? 本文只探究查询优化器选择索引的大体逻辑,没有深入到C++源码,日常开发同学了解到这个程度足够了,如果是DBA同学,显然需要去读一读MySQL的C++源码 通过MySQL提供的trace工具,我们一起探究下查询优化器都做了什么 mysql提供了trace工具,默认是关闭的,可以通过命令将其打开 mysql> set session optimizer_trace="en 阅读详情

相关推荐

【MySQL】索引

普通索引(也称为非唯一索引)是最基本的索引类型。它没有任何特殊的约束,仅仅是为了加速查询。索引列的值可以重复。一个表可以有多个普通索引。

宅男很神经 1559

MySQL 索引:优化数据库性能的关键

索引是一种数据结构,它可以帮助数据库快速定位和检索数据。在 MySQL 中,索引是存储在磁盘上的一个数据结构,它包含了表中一列或多列的值以及对应的行指针。当执行查询语句时,数据库引擎可以使用索引快速定位到满足查询条件的行,而不需要扫描整个表。MySQL 索引是提高数据库查询性能的重要工具。通过理解索引的概念、原理、类型、创建方法以及优化策略,可以更好地利用索引来提升数据库的性能。

果酱 の 博客 1493

科研绘图实战:用Adobe Illustrator高效排版期刊论文图片

本文详细介绍了使用Adobe Illustrator高效排版科研论文图片的完整工作流。针对期刊投稿常见的图片格式问题,文章重点讲解了矢量图与位图的预处理、AI中的精准对齐与分布技巧、文字样式统一管理以及最终输出TIFF/PDF等符合出版要求的格式。掌握这套方法能确保图片满足高分辨率、规范字体和精确尺寸等期刊硬性标准,显著提升投稿效率。

tomato的博客 1430

MySQL数据库设计常用技巧和设计规范(三):数据库设计规范

数据库设计规范数据库设计规范2.1 数据库设计2.1.1 库名2.1.2 表结构2.1.3 列数据类型优化2.1.4 索引设计2.1.5 分库分表、分区表2.1.6 字符集2.1.7 程序层DAO设计建议2.1.8 一个规范的建表语句示例2.2 SQL编写2.2.1 DML语句2.2.2 多表连接2.2.3 事务2.2.5 线上禁止使用的SQL语句 数据库设计规范 2.1 数据库设计 以下所有规范会按照【高危】、【强制】、【建议】三个级别进行标注,遵守优先级从高到低。 对于不满足【高危】和【强制】两个级别

weixin_38924500的博客 1015

FID指标实战:如何用Python快速计算生成图像的质量分数(附完整代码)

本文详细介绍了如何使用Python计算Fréchet Inception Distance(FID)指标,以评估生成图像的质量。通过完整的代码示例和优化技巧,帮助开发者快速实现FID计算,并解读分数背后的实际意义,适用于GAN和扩散模型的性能评估。

weixin_28718487的博客 375

WandB本地部署踩坑指南:从Docker启动到License更新的完整流程(附常见错误解决方案)

本文详细介绍了Weights & Biases(WandB)机器学习实验管理平台的本地化部署全流程,涵盖从Docker环境搭建、许可证管理到常见错误排查的实战经验。针对企业级应用场景,文章还提供了性能优化、高可用架构设计及开源替代方案Trackio的评估与迁移策略,为构建安全、可控的内部实验追踪平台提供完整解决方案。

potato的博客 567

【知识整理】MySQL数据库开发设计规范

MySQL数据库与 Oracle、 SQL Server 等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计。在数据库变更和处理流程、数据库表设计、SQL编写等方面予以规范,从而为公司业务系统稳定、健康地运行提供保障。

李木 2014

【固态变压器(SST)全维度解析】发展历史、技术、玩家、挑战与数据中心趋势

SST正处于技术突破向规模化商用的关键过渡期,随着SiC/GaN器件降价、标准完善、可靠性数据积累,其在数据中心的渗透率将快速提升。短期(2025 - 2027年)以示范项目为主,中长期(2030年后)有望成为超大规模智算中心的主流供电方案。

昔时扬尘处 2127

mysql key idx,Mysql中key 、primary key 、unique key 与index区别

key 是数据库的物理结构,它包含两层意义和作用,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)。https://www.cnblogs.com/zjfjava/p/6922494.htmlCREATE TABLE `act_ru_execution` (`ID_` varchar(64) COLLATE utf8_bin NOT NULL,`REV_` int(11) ...

weixin_28812205的博客 750

【Docker】常见容器问题解决#OCI runtime create failed: container_linux.go:349: starting container process

ERROR: for nginx Cannot start service nginx: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/data/docker-compose/n

liu_chen_yang的博客 5528

【YOLO】YOLOV5-Seg的Segment模块解析

Segment模块同时输出检测结果和分割掩模,通过轻量级分割头实现实时实例分割

浩瀚之水的专栏 598

基于“SpringBoot+uniapp的考研书库微信小程序设计与实现7000字论文

本文设计并实现了一个基于 SpringBoot 后端和 uniapp 前端的考研书库微信小程序,旨在为考研学生提供便捷的电子资料查询、在线学习和社交交流平台。系统采用前后端分离架构,通过 RESTful API 实现数据交互,支持用户注册登录、资料分类检索、笔记共享、学习计划管理等功能。论文详细阐述了系统需求分析、架构设计、数据库设计、功能模块实现及测试评估过程,最终验证了系统的可行性和实用性。

mr_lili_111的博客 1240

手把手教你学Simulink--基于Simulink的高增益DC-DC变换器仿真建模

特点高电压增益:可以在不使用变压器的情况下实现较大的电压升压比。适用于低电压源:如太阳能电池板、燃料电池等提供的低压直流电源。效率问题:设计时需特别注意提高效率,减少能量损失。挑战电路复杂性:通常涉及多个电感和电容,以及复杂的开关模式。元件选择:合适的元件参数对于达到理想性能至关重要。控制策略:确保高效稳定运行的同时,适应负载变化。首先明确要模拟的任务内容。实现特定的电压增益比(例如从24V升至380V)。根据预期的输入输出电压确定合适的电路拓扑和元件值。

MHD0815的博客 173

mysql基础(九) MYSQL 索引类型

一、简介 MySQL目前主要有以下几种索引类型: 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 二、语句 CREATE TABLE table_name[col_name data type] [unique|fulltext][index|key][index_name](col_name[length])[asc|desc] 1.unique|fulltext...

babyZeng 262

某AI推荐系统项目管理复盘:架构师总结的6大方法论与调优策略

我是张三,某大厂资深AI架构师,主导过5个千万级用户的推荐系统项目(覆盖电商、内容、视频、音乐、外卖等场景)。我的公众号“AI架构师笔记”会分享更多AI项目管理和技术实战经验,欢迎关注。最后的话:推荐系统不是“一锤子买卖”,而是“持续优化的过程”。希望这篇文章能帮你少踩坑,多做对——毕竟,把复杂的事做成,才是架构师的核心能力。

2501_92132293的博客 362

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

mysql view index_mysql基础(九) 索引和视图

索引:是一种按照特定存储格式存储的特殊数据,用于SQL查询索引的类型:聚集索引和非聚集索引:数据是否和索引存储在一起主键索引和辅助索引:索引是否在主键之上左前缀索引和覆盖索引:是否只截取左边的前几个字节最为索引,mysql默认使用左前缀索引左前缀索引的存储:在指定索引的字段中截取左边的前几个字节生成索引,并对索引进行排序处理,将排完序的索引进行分组管理并生成源数据,当用户以索引字段作为查询条件时,...

weixin_42451611的博客 176

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL索引从基础到原理,看这一篇就够了

索引是SQL优化中最重要的手段之一,本文从基础到原理,带你深度掌握索引。

三分恶的博客 6554

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【MySQL基础】MySQL索引全面解析:从原理到实践

【MySQL基础】MySQL索引全面解析,从底层实现到熟练上手!!

2301_80220607的博客 2465

MySQL篇九:索引

索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index ,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。主键索引(primary key)唯一索引(unique)普通索引(index)全文索引(fulltext)–解决中子文索引问题。

忘忧. 1707

【MySQL基础】索引

MySQL索引结构、各种概念、失效场景、设计原则与优化

scj1022的博客 3119

MySQL:索引

索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的create index ,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删 除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。

weixin_51142926的博客 2336

MySQL从入门到精通(九):索引

本文详细介绍了MySQL索引的相关知识,包括索引的概述、结构、分类、语法、性能分析、使用技巧及设计原则。文章还介绍了索引的创建、查看和删除语法,并通过案例演示了索引的实际应用。在SQL性能分析部分,探讨了SQL执行频率、慢查询日志、profile详情和explain命令的使用。最后,文章总结了索引的使用技巧和设计原则。

gadiaola的博客 1293

MySQL索引-索引基础

下面创建索引的语句,二者等效。– 创建user_name列上的索引– 等效于 显式添加主键id创建索引– 对比两个索引的统计数据对比一下两个索引的结果,

2501_90392169的博客 832

mysql按升序创建索引_MySQL建立索引的基础规则

1、mysql索引(基础与规则)索引规则:一、MySQL建表,字段需设置为非空,需设置字段默认值。二、MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。三、MySQL建表,如果字段等价于外键,应在该字段加索引。四、MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。五、MySQL使用时,一条SQL...

weixin_39593593的博客 3034

【MySQL】索引基础

索引本质上是数据库引擎用来快速查找数据的数据结构索引能显著提高查询的性能索引内部通常被存储为二进制树在多数情况下,索引很小,足以放进内存,所以使用索引查找数据更快。因为从内存中读取数据总是比从磁盘中读取数据更快。使用索引会带来的问题索引会增加数据库的大小,因为索引必须永久存储在表旁。每次添加、更新或删除记录时,MySQL必须更新对应的索引,这会影响正常操作的性能。因此,应为性能关键的查询保留索引。不应基于表来创建索引,而是基于查询创建索引。因为使用索引的目的是为了加快运行较慢的查询。

xuwuuu的博客 1146
上一篇: MySQL基础(八):DML语句
下一篇: MySQL基础(四):表的完整性约束
April_0911
博客等级 码龄10年 1404粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值