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.mfbz.cn/a/395470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ai笔记10] 关于sora火爆的反思

欢迎来到文思源想的ai空间,这是技术老兵重学ai以及成长思考的第10篇分享! 最近sora还持续在技术圈、博客、抖音发酵,许多人都在纷纷发表对它的看法,这是一个既让人惊喜也感到焦虑的事件。openai从2023年开始,每隔几个…

【软考问题】-- 14 - 知识精讲 - 项目配置与变更管理

一、基本问题 问题1:什么是配置项? 定义:为配置管理设计的硬件、 软件或二者的集合, 在配置管理过程中作为一个单个实体来对待。分类:软件、硬件和各种文档。问题2:配置库分为哪三类? &#xff…

如何用 Moodle 和 ONLYOFFICE 创建在线学习平台

在教学过程中使用现代在线学习软件,已不再是什么稀奇事。在世界各地,越来越多的教师和学生都在使用现代技术,应用新的学习场景,包括学生在传统课堂之外更积极的参与、更密切的互动。 Moodle 支持各类学校和大学充分利用在线教育过…

单片机和RTOS

一.单片机和RTOS区别 单片机是一种集成了处理器、内存、输入输出接口和外围设备控制器等功能的微型计算机系统。它通常用于控制简单的嵌入式系统,如家电、汽车电子、工业控制等。单片机具有低功耗、低成本和高可靠性等特点。 而RTOS(Real-Time Operati…

每日一题(珠玑妙算,两数之和)

面试题 16.15. 珠玑妙算 - 力扣(LeetCode) int* masterMind(char* solution, char* guess, int* returnSize) //定义一个函数masterMind,它接受三个参数:solution(正确答案),guess(玩…

2024年及以后在您的项目中使用的最佳CSS框架

在过去几年中,CSS已经取得了长足的进步。在过去,您可能会使用CSS来创建依赖于HTML表格和CSS浮动作为其布局系统的简单外观的Web应用程序。而现在,您可以设计复杂的交互式用户界面,具有优雅的设计。 尽管CSS变得越来越先进&#x…

前端(二十七)——封装指南:Axios接口、常用功能、Vue和React中的封装技术

😊博主:小猫娃来啦 😊文章核心:前端封装指南:Axios接口、常用功能、Vue和React中的封装技术 本文目录 小引前端封装以真实项目举个例子 Axios接口封装常用功能封装封装 Vue中的封装技术React中的封装技术Vue和React封装…

Java+Vue+MySQL,国产动漫网站全栈升级

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

IDEA报错:无法自动装配。找不到 ... 类型的 Bean。

今天怎么遇见这么多问题。 注:似乎只有在老版本的IDEA中这个报错是红线,新版的IDEA就不是红线了(21.2.2是红的) 虽然会报错无法自动装配,但启动后仍能正常执行 不嫌麻烦的解决做法:Autowired的参数reques…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(一)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型,由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”(そら sora),即天空之意,以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

Android开发的调试利器-BlueStacks

工欲善其事,必先利其器,作为Android开发的模拟器选择,还是费了好一阵工夫。开始采用Android Studio自带的模拟器,因为发现其支持的类型极其丰富,于是总想将其折腾好,但结果是浪费了很多时间,仍然…

Stable Diffusion ComfyUI安装详细教程

上一篇文章介绍了sd-webui的安装教程,但学习一下ComfyUI这种节点流程式的对理解AI绘画有较大帮助,而且后期排查错误会更加方便,熟练后用这种方式做AI绘画可玩性会更多。 文章目录 一、安装包说明二、安装文件介绍三、安装步骤四、汉化五、云主…

【Java】小白必须要懂的关于反射的极简基础知识

目录 反射概念 JVM基础 Class对象之源:类的加载过程 反射获取Class对象的三种方法 Class对象的三种常用方法 三种常用方法对应的后续调用 用反射来实现命令执行 反射概念 反射(Reflection)是指在程序运行时可以检查、获取和修改类的…

如何快速部署幻兽帕鲁私人服务器:适合零基础小白的指南

看了许多关于如何部署服务器的,大部分都是要买阿里云或者腾讯云的服务器并且至少四核以上才能保证流畅运行。 但是对于想搭建私服但又没有技术的小白,确实是有点难度了。购买云服务器后还要配置服务器,配置OpenVPN、PalServer,doc…

纯净住宅代理有何优势?为什么要用它?

随着互联网的快速发展,代理服务器已经成为许多在线活动的关键组成部分,从数据挖掘到网络安全。然而,随着技术的不断发展,住宅IP代理正崭露头角,因其在保障隐私、提升性能和应对封锁方面的卓越优势而备受瞩目。本文将深…

瑞_23种设计模式_代理模式

文章目录 1 代理模式(Proxy Pattern)1.1 介绍1.2 概述1.3 代理模式的结构 2 静态代理2.1 介绍2.2 案例——静态代理2.3 代码实现 3 JDK动态代理★★★3.1 介绍3.2 代码实现3.3 解析代理类3.3.1 思考3.3.2 使用 Arthas 解析代理类3.3.3 结论 3.4 动态代理…

常用的激活函数python代码-简洁版-想画好看的激活函数图的第一步

激活函数python代码 最近在写毕业论文,其中需要介绍一些基础的激活函数,然后如果直接用matplot绘图其绘图结果不是矢量图,而且不能像Origin一样修改线条,坐标轴之类的,但是如果像用Origin画就需要生成横纵坐标的数据然…

数据结构day1

定义一个学生结构体&#xff0c;包含结构体成员&#xff1a;身高&#xff0c;姓名&#xff0c;成绩&#xff1b;定义一个结构体数组有7个成员&#xff0c;要求终端输入结构体成员的值&#xff0c;根据学生成绩&#xff0c;进行冒泡排序。 #include <stdio.h> #include &l…

贪心算法之合并区间

“任世界多宽广&#xff0c;停泊在这港口~” 区间问题&#xff0c;涉及到最多的就是 取交集 和 并集的概念。我们使用C排序算法后&#xff0c;其默认规则就是按照 “左排序”进行的。因而&#xff0c;我们实质上注意的是每一个区间的 右端点&#xff0c;根据题目要求&#xff…

基于AI的RAG需要真正面对商业化场景和落地的几大致命陷井

背景 人人在谈AI&#xff0c;可是AI落地在哪&#xff1f;AI到底可以给我们带来什么&#xff1f; 随着流量红利模式的衰退、AI犹如一针强心剂一样打给了整个IT领域。 AI作图-漂亮、惊艳、快&#xff1b;AI视频-人人可以成为短视频专家&#xff1b;AI辅助编程-1人顶7人&#x…