MySQL学习记录——십일 索引

文章目录

  • 1、理解索引
  • 2、聚簇、非聚簇索引
  • 3、操作
    • 1、主键索引
    • 2、唯一键索引
    • 3、普通索引
    • 4、注意事项
  • 4、全文索引


1、理解索引

MySQL服务器是在内存中的,所有数据库的CURD操作都是在内存中进行,索引也是如此。索引是用来提高性能的,它通过组织数据的方式来提高效率。

MySQL工作在应用层。磁盘的IO以4KB为单位,MySQL则是16KB,由磁盘往系统内部的缓冲区放入数据,达到16KB后再放入MySQL的缓冲区。

MySQL 中的数据文件,是以page为单位保存在磁盘当中的。CURD 操作,都需要通过计算,找到对应的插入位置,或者找到对应要修改或者查询的数据。而只要涉及计算,就需要CPU参与,而为了便于CPU参与,一定要能够先将数据移动到内存当中。所以在特定时间内,数据一定是磁盘中有,内存中也有。后续操作完内存数据之后,以特定的刷新策略,刷新到磁盘。而这时,就涉及到磁盘和内存的数据交互,也就是IO了。而此时IO的基本单位就是Page。

为了更好的进行上面的操作, MySQL 服务器在内存中运行的时候,在服务器内部,就申请了被称为 Buffer Pool 的大内存空间,来进行各种缓存。其实就是很大的内存空间,来和磁盘数据进行IO交互。

主键索引(primary key)
唯一索引(unique)
普通索引(index)
全文索引(fulltext) – 解决中子文索引问题。

create table if not exists user ( id int primary key, age int not null, name varchar(16) not null );insert into user (id, age, name) values(3, 18, '杨过');
insert into user (id, age, name) values(4, 16, '小龙女');
insert into user (id, age, name) values(2, 26, '黄蓉');
insert into user (id, age, name) values(5, 36, '郭靖');
insert into user (id, age, name) values(1, 56, '欧阳锋');

创建一个具有主键的表,乱序插入数据,数据会自动排序。MySQL对于多个同时存在的page会先描述再组织,page内部有一些管理信息,在MySQL的缓冲区内对所有的page进行管理,不同的page有两个指针,和其它page组成双链表。一个page会保存好很多信息,用户就可以直接在内存中交互,page通过预加载机制和局部性原理来保存很多信息方便用户IO。IO次数多对IO效率影响很大。

插入时的排序是mysql服务自己做的,也是为了更好地管理数据。page之间,page内部都是链式结构。MySQL中有一部分空间,用来存放页目录,目录有两个字段,一个指向起始数据记录的key值,也就是它的序号,另一个指向这个记录的起始地址。要查找的记录,比如4,那就从头开始看两个目录之间的范围有没有4,没有就继续往下找,有就进入这个范围,继续找。page逐渐增多时,MySQL会自动扩容,并将这些新增的page继续管理起来。

page之间有页目录,page内部也有目录,内部的目录只保存自己目录的数据记录的起始编号。一个page大概可以管理1300多个page,一个page管理的很多个子page,这些子page还可以有自己的子page,MySQL管理page的结构就是B+树。叶子节点保存数据,非叶子节点只保存目录项,叶子节点全部用链表级联起来。所以这棵树是矮胖型的,那么途径的路上节点就比较少,找到目标数据需要更少的page,IO次数就会更少,也就提高了效率。

整个结构是mysql的innode db下的索引结构。建表插入数据的时候,就是在该结构下进行CURD。即使没有主键,也是如此,因为有默认主键。索引自顶向下搜索。

2、聚簇、非聚簇索引

除了上面所说的innnode db的索引,还有MyISAM的存储引擎。采用B+树,叶子节点存放数据记录的地址,而上面的叶子节点还会存放起始编号。上面的是聚簇索引,叶子节点只存放地址的是非聚簇索引。

建立非聚簇索引的表

create table test2( id int primary key, name varchar(20) not null )engine=myisam;

myisam可以给一张表建立多个索引,索引本质就是B+树这个数据结构。innodb如果没有主键索引,那么建立的普通(辅助)索引中,叶子节点没有数据,只有对应记录的key值。通过辅助索引找到主键,用主键到主索引中检索获得记录,这是回表查询。

3、操作

1、主键索引

有3种方式。第一种就是之前在创建表时,某一列后加上primary key,之后不需要再做什么,就创建了主键索引;第二种和第一种一样,只是写法不一样

//第一种
>create table user(id int primary key, name varchar(20));
//第二种
>>create table user(id int, name varchar(20), primary key(id));

第三种

create table user(id int, name varchar(20));
//创建表以后再添加主键
alter table user add primary key(id);

查看索引

show index from 表名;
show keys from 表名;

在这里插入图片描述

BTREE就表示B+树。

删除索引

alter table 表名 drop primary key;

主键索引特点

一个表中,最多有一个主键索引,也可以使用复合主键
主键索引的效率高(主键不可重复)
创建主键索引的列,它的值不能为null,且不能重复
主键索引的列基本上是int

2、唯一键索引

//第一种
create table user(id int primary key, name varchar(20) unique);
//第二种
create table user(id int primary key, name varchar(20), unique(name));
//第三种
create table user(id int primary key, name varchar(30));
alter table user add unique(name);

唯一键索引特点

一个表中,可以有多个唯一索引
查询效率高
如果在某一列建立唯一索引,必须保证这列不能有重复数据
如果一个唯一索引上指定not null,等价于主键索引

删除唯一键索引

alter table 表名 drop index Key_name;

3、普通索引

//第一种
create table user(id int primary key, name varchar(20), index(name));
//第二种
create table user(id int primary key, name varchar(20));
alter table user add index(name);
//第三种, 可以给普通索引自己起名
create table user(id int primary key, name varchar(20));
create index 索引名 on user(name);

普通索引特点

一个表中可以有多个普通索引,普通索引在实际开发中用的比较多
如果某列需要创建索引,但是该列有重复的值,那么我们就应该使用普通索引

删除普通索引

alter table 表名 drop index Key_name;
drop index Key_name on 表名;

可以写index(a, b),也就是把两列合起来做一个普通索引,这也就是复合索引。查找时必须两者都符合才能找到。默认a是key值。复合索引在show index时会显示多个Key_name相同的部分,删除时也会删除多个。

索引覆盖是指在复合索引中搜索时能够直接搜索到需要的数据,那就不需要回表查询。索引在匹配时,都是从记录的最左侧开始匹配。

4、注意事项

比较频繁作为查询条件的字段应该创建索引
唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
更新非常频繁的字段不适合作创建索引
不会出现在where子句中的字段不该创建索引

4、全文索引

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

在mysql语句之前写上explain可以看到要这条语句的执行计划。

全文索引例子

select * from 表名 where match( , ) against (‘’);

match使用全文索引,against用来匹配。

结束。

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

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

相关文章

「计算机网络」数据链路层

数据链路层的地位:网络中的主机、路由器等都必须实现数据链路层信道类型 点对点信道:使用一对一的点对点通信方式广播信道 使用一对多的广播通信方式必须使用专用的共享信道协议来协调这些主机的数据发送 使用点对点信道的数据链路层 数据链路和帧 链…

java-8组合式异步编程

11.1 Future 接口 Future接口在Java5中被引人,设计初衷是对将来某个时刻会发生的结果进行建模。它建模了一种异步计算,返回一个执行运算结果的引用,当运算结束后,这个引用被返回给调用方。在Future中触发那些潜在耗时的操作把调用…

Python 使用 raise 语句抛出异常

在 Python 编程中,异常处理是至关重要的一部分。异常能够帮助程序在面对错误和意外情况时进行适当的处理,从而使程序具有更好的稳定性和可靠性。而 raise 语句则是 Python 中用来手动触发异常的关键工具之一。本文将探讨 Python 中 raise 语句的使用方法…

MinIO 和 Apache Tika:文本提取模式

Tl;dr: 在这篇文章中,我们将使用 MinIO Bucket Notifications 和 Apache Tika 进行文档文本提取,这是大型语言模型训练和检索增强生成 LLM和RAG 等关键下游任务的核心。 前提 假设我想构建一个文本数据集,然后我可以用它来微调 LLM.为了做…

【Cocos入门】物理系统(物理碰撞)

物理碰撞 物理引擎默认是关闭状态以节省资源开销。开启方法和之前的普通碰撞类似:cc.director.getPhysicsManager().enabled true但有一个区别,物理引擎的开启必须放在onLoad函数内运行,否则不生效。 物理碰撞组件也同样具有碰撞回调函数。…

爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺

首先淘宝需要登录,这一点如果用selenium如何解决,只能手动登录?如果不用selenium,用cookies登录也可。但是验证码又是一个问题,现在的验证码五花八门,难以处理。 我们回到正题,假设你已经登录上…

Codeforces Round 926 (Div. 2)

C:Sasha and the Casino 类似于倍投法,就是在一赔一的情况下,第一次压一块钱,每输一次就押注上一次两倍的金额. 假如资金无限的话,这种方法赢的期望为无穷大.原理类似于二进制,不论你输再多次,只要赢一次总额就增加了1.比如 15 二进制1111,…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核内存管理-动态内存

目录 一、动态内存运行机制二、动态内存开发流程三、动态内存使用说明四、动态内存核心算法五、动态内存接口六、代码分析(待续...)坚持就有收获 一、动态内存运行机制 动态内存管理,即在内存资源充足的情况下,根据用户需求&…

算法--数论二

这里写目录标题 高斯消元高斯消元求线性方程组用途高斯消元的数学思想例题代码 二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 高斯消元 高斯消元求线性方程组 用途 这个…

Vite 5.0 正式发布

11 月 16 日,Vite 5.0 正式发布,这是 Vite 道路上的又一个重要里程碑!Vite 现在使用 Rollup 4,这已经代表了构建性能的大幅提升。此外,还有一些新的选项可以改善开发服务器性能。 Vite 4 发布于近一年前,它…

黄金交易策略(Nerve Nnife.mql4):做单手数设计

完整EA:Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 NK的做单量是由参数设定的,以下分别是参数项: 考虑到复利的情况,若10000本金,在以上三个参数的设计下,第1单的购买量是0.01*10,第2单是0.01*10*2…

Tuxera NTFS 2024永久免费版Mac系统NTFS磁盘读写软件

Tuxera NTFS 2024是一款Mac系统NTFS磁盘读写软件,由Tuxera公司开发。该软件可以在Mac上打开、编辑、复制、移动或删除存储在Windows NTFS格式USB驱动器上的文件。对于需要在Mac和Windows之间频繁传输文件的用户来说,Tuxera NTFS 2024无疑是一个方便且高效…