MySQL普通索引(BTREE索引)以及最左前缀匹配
在mysql中,普通索引,也就是BTREE索引分两类,一个是单列索引 另一个是多列索引
1.索引的作用:
当一个数据表只有很少量的数据时,索引体现不了他的价值。但若是一个表有10w多的数据时,查找数据就要全表查找,最差要查找10w个数据,太慢了,若是用索引的话,就会大大减少时间,例如对 score字段做一个索引,索引会生成一个文件,查找数据就到索引文件中查找,又因为索引出来的数据是已经排好序的,所以查找时,数据库会用类似二分法的查找,这样会比不用索引快很多倍。
2.单列索引和多列索引:
一,单列索引:
单列索引是给单个字段做索引,如给math字段。
alter table `zje` add index math_index( `math` ); //作用是给 zje表 中的math字段加一个索引,索引名叫 math_index
或者
create index math_index on `zje`(`math`);
用命令 show index from `zje`;可以查看是否建立了索引:
可以看到 存在 math_index 索引的信息
建立索引后,我们就要使用索引,索引一般是用于查找信息(用select语句)
注意:
使用索引时,不能select * ,这样的话,索引是无法使用的,select后面跟的应该包含索引所在的字段,例如上面我设置了 math字段的索引为 math_index
则就要写成 select `math` from `zje`;(selct `math`,`english` from `zje` ;也可以,只要有math字段就行)因为索引生成索引文件,里面放的是索引对应字段的数据。
使用 select `math` from `zje`;得出的结果:
可以看出,数据是应该排好序的,因为只要是用到索引,被查找后的字段都会被排好序的。
删除索引:
alter table `zje` drop index math_index; //删除zje表中的 名为 math_index 的索引
或者
drop index math_index ON `zje`;
二,多列索引:
多列索引是一个索引对应多个字段的数据。
例如我们想查找 数学成绩>60 且 英语成绩 >60 的学生。可以用多列索引,当然你说用2个单列索引,分别是数学 和 英语的索引行不行?
其实也是可以的,但也有区别,下面会讲解:
创建一个多列索引:
alter table `zje` add index indexes(`math`,`english`); //在zje表中创建一个 为名 indexes 的多列索引,包含 math,english字段。
感兴趣的可以用 show index from `zje`;查看是否有创建。
然后对zje表:
select `math`,`english` from `zje` where `math`>60 and `english`>60; //在zje表中找出数学和英语成绩都高于60的数据
可以看出,数据也是排好序的。
接下来介绍 多列索引的一个重要性质:
最左前缀:
最左前缀的意思是,例如我创建的多列索引是 (math,english)这样表示的,则:
select `math` from `zje` ;
select `math`,`english` from `zje` ;
上面的写法都可以使用多列索引,第一行的写法相当于math的单列索引
而
select `english` from `zje` ;
则会使用索引失效,因为他不是math开头
删除多列索引跟删除单列索引一样。
三,唯一索引:
与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须是唯一的,创建方法和普通索引类似。
创建唯一索引
create unique index index_math ON `zje`(`math`)
修改表结构
alter tabel `zje` add unique index index_math ON (`math`)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
最后讲回一开始的问题,既然多列索引的表现形式跟多设置几个单列索引没什么不同,那为什么还要有多列索引呢?
因为即使设置了多个单列索引,但是数据库在搜索数据时,会挑出一个最严格的索引使用,其二是一个表中,索引是越少越好的
其他相关知识:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)