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.rhkb.cn/news/258083.html

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

相关文章

Mysql Day03

多表设计 一对多 在多的一方添加外键约束,关联另外一方主键 一对一 任意一方添加外键约束,关联另外一方主键 多对多 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键 idstu_idcourse_id 1 11 2 12313421524 案…

使用cocos2d-console初始化一个项目

先下载好cocos2d-x的源码包 地址 https://www.cocos.com/cocos2dx-download 这里使用的版本是 自己的电脑要先装好python27 用python安装cocos2d-console 看到项目中有个setup.py的一个文件 python setup.py 用上面的命令执行一下。 如果执行正常的话回出现上面的图 然后…

备战蓝桥杯---图论之最短路Bellman-Ford算法及优化

目录 上次我们讲到复杂度为(nm)logm(m为边,n为点)的迪杰斯特拉算法,其中有一个明显的不足就是它无法解决包含负权边的图。 于是我们引进Bellman-Ford算法。 核心:枚举所有的点,能松弛就松弛,直…

2.16学习总结

1.邮递员送信(dijkstra 不只是从起到到目标点,还要走回去) 2.炸铁路(并查集) 3.统计方形(数据加强版)(排列组合) 4.滑雪(记忆化) 5.小车问题(数学问题&#x…

枚举,#define,C中程序内存区域划分

目录 一、枚举 1.1枚举类型的声明 1.2枚举类型的优点 1.3枚举类型的使用 二、#define定义常量 三、C中程序内存区域划分 一、枚举 1.1枚举类型的声明 枚举顾名思义就是⼀⼀列举。 把可能的取值⼀⼀列举。 比如我们现实生活中: ⼀周的星期⼀到星期日是有限…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第三天-ARM Linux ADC和触摸屏开发 (物联技术666)

链接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码:1688 教学内容: 1、ADC S3C2440的A/D转换器包含一个8通道的模拟输入转换器,可以将模拟输入信号转换成10位数字编码。 在A/D转换时钟频率为2.5MHz时&…

【QT+QGIS跨平台编译】之四十:【gsl+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、GSL介绍二、GSL下载三、文件分析四、pro文件五、编译实践一、GSL介绍 GSL(GNU Scientific Library)是一个开源的数值计算库,用于提供一系列常用的数学函数和算法。它为科学计算和数据分析提供了高效、可靠的工具。 GSL库提供了丰富的功能,包括数值积分、数值…

数据分析基础之《pandas(8)—综合案例》

一、需求 1、现在我们有一组从2006年到2016年1000部最流行的电影数据 数据来源:https://www.kaggle.com/damianpanek/sunday-eda/data 2、问题1 想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取? 3、问题…

Compose 自定义 - 数据转UI的三阶段(组合、布局、绘制)

一、概念 组合阶段 Compisition 界面首次渲染时会将可组合函数转化为一个个布局节点 Layout Node, 使用多叉树的数据结构构建一个UI树。 布局阶段 Layout 多叉树中父节点会测量他们的子节点,然后在一个二维空间里进行摆放。通过从上往下测量(如果存在子…

【C语言】Linux内核accept 系统调用代码

一、Linux 4.19内核accept 系统调用代码中文注释 /** 在使用accept时,我们尝试创建一个新的socket,与客户端建立连接,* 唤醒客户端,然后返回新的连接文件描述符(fd)。我们在内核空间收集* 连接方的地址&am…

C#利用接口实现选择不同的语种

目录 一、涉及到的知识点 1.接口定义 2.接口具有的特征 3.接口通过类继承来实现 4.有效使用接口进行组件编程 5.Encoding.GetBytes(String)方法 (1)检查给定字符串中是否包含中文字符 (2)编码和还原前后 6.Encoding.GetS…

NLP_Transformer架构

文章目录 Transformer架构剖析编码器-解码器架构各种注意力的应用Transformer中的自注意力Transformer中的多头自注意力Transformer中的编码器-解码器注意力Transformer中的注意力掩码和因果注意力 编码器的输入和位置编码编码器的内部结构编码器的输出和编码器-解码器的连接解…

【Web】小白友好的Java内存马基础学习笔记

目录 简介 文件马与内存马的比较 文件马原理 内存马原理 内存马使用场景 内存马分类 内存马注入方式 这篇文章主要是概念性的,具体技术细节不做探究,重点在祛魅。 简介 内存马(Memory Shellcode)是一种恶意攻击技术&…

抽象的问题1

vue3&#xff0c;在使用v-mode绑定属性时&#xff0c;发生了奇怪的问题&#xff0c;渲染失败了 代码如下 <template><div><form><div>账号<input v-model"form_user_Data.username" type"text"></div><div>密…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-软件定时器

目录 一、软件定时器基本概念二、软件定时器运行机制三、软件定时器状态四、软件定时器模式五、软件定时器开发流程六、软件定时器使用说明七、软件定时器接口八、代码分析&#xff08;待续...&#xff09;坚持就有收获 一、软件定时器基本概念 软件定时器&#xff0c;是基于系…

bpmn-js 事件总线处理

bpmn-js中使用EventBus作为事件的处理句柄&#xff0c;EventBus的使用和我们常规使用的事件总线没啥大的区别&#xff0c;其源码位于&#xff1a;/diagram-js/lib/core/EventBus.js &#xff08;bpmn-js使用diagram-js实现流程图的web端绘制呈现工具&#xff09;。 EventBus使用…

Kibana:如何嵌入 Kibana 仪表板

作者&#xff1a;Carly Richmond 像我这样的前端工程师经常提出的要求是将 Kibana 等来源的现有仪表板嵌入到 JavaScript Web 应用程序中。 这是我必须多次执行的任务&#xff0c;因为我们希望快速部署用户生成的视图或允许用户控制给定的视图。 从我们从精彩的开发者社区收到的…

算法沉淀——BFS 解决 FloodFill 算法(leetcode真题剖析)

算法沉淀——BFS 解决 FloodFill 算法 01.图像渲染02.岛屿数量03.岛屿的最大面积04.被围绕的区域 BFS&#xff08;广度优先搜索&#xff09;解决 Flood Fill 算法的基本思想是通过从起始点开始&#xff0c;逐层向外扩展&#xff0c;访问所有与起始点相连且具有相同特性&#xf…

【小沐学GIS】基于WebGL绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…

B端系统从0到1:有几步,其中需求分析要做啥?

一款B系统从无到有都经历了啥&#xff0c;而其中的需求分析又要做什么&#xff1f;贝格前端工场给老铁们做一下分析&#xff0c;文章写作不易&#xff0c;如果咱们有界面设计和前端开发需求&#xff0c;别忘了私信我呦&#xff0c;开始了。 一、B端系统从0到1都有哪些要走的步骤…