9.MySQL 索引

目录

​​​​​​​概述

概念:

单列索引

普通索引

创建索引

查看索引

删除索引

唯一索引

创建唯一索引

删除唯一索引

主键索引

组合索引

创建索引

全文索引

概述

使用全文索引

空间索引

内部原理

相关算法:

hash算法

二叉树算法

平衡二叉树

⭐Btree树算法

MylSAM引擎使用B+Tree

InnoDB引擎使用B+Tree

特点总结

优点

缺点

使用原则


概述

概念:

  • 索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。
  • 索引类似一本书的目录,比如要查找'student'这个单词,可以先找到s开头的页然后向后查找,这个就类似索引。
     
  • 按照实现方式可以分为hash索引、B+tree索引

单列索引

单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引;
 

普通索引

普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。

创建索引

-- 方式1 创建表的时候直接指定
create table student(
	sid int primary key,
	card_id varchar(20),
	name varchar (20),
	gender varchar (20),
	age int,
	birth date,
	phone_num varchar(20),
	score double,
	index index_name(name) -- 给name列创建索引
)

-- 方式2 直接创建
create index index_gender on student(gender);

-- 方式3 修改表结构(添加索引)
alter table student add index index_age(age);

查看索引

-- 1、查看数据库所有索引
-- select * from mysql.innodb_index_stats a where  a.database_name = '数据库名' 
select * from mysql.innodb_index_stats a where  a.database_name = 'mydb2';

-- 2、查看表中所有索引
-- select * from mysql.innodb_index_stats a where  a.database_name = '数据库名' and a.table_name like '%表名%';
select * from mysql.innodb_index_stats a where  a.database_name = 'mydb2' and a.table_name like '%student%';

-- 3、查看表中所有索引
-- show index from 表名
show index from student;

删除索引

-- 删除索引
drop index index_name on student;

alter table student drop index index_gender; 

唯一索引

  • 唯一索引与前面的普通索引类似,不同的就是:
  • 索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

创建唯一索引

删除唯一索引

主键索引

  • 每张表一般都会有自己的主键,当我们在创建表时,MySQL会自动在主键列上建立一个索引,这就是主键索引。主键是具有唯一性并且不允许为NULL,所以他是一种特殊的唯一索引

组合索引

  • 组合索引也叫复合索引,指的是我们在建立索引的时候使用多个字段,例如同时使用身份证和手机号建立索引,同样的可以建立为普通索引或者是唯一索引。
  • 复合索引的使用复合最左原则。

创建索引

-- 组合索引
create index index_phone_name on student(phone_num,name);

-- 删除索引
drop index index_phone_name on student;

全文索引

概述

  • 全文索引的关键字是fulltext
  • 全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,它更像是一个搜索引擎,基于相似度的查询,而不是简单的where语句的参数匹配。
  • like +%就可以实现模糊匹配了,为什么还要全文索引? like +%在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like +%快N倍,速度不是一个数量级,但是全文索引可能存在精度问题。
  • 只有字段的数据类型为char、varchar、text及其系列才可以建全文索引;
  • 在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用create index创建fultext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多
  • 测试或使用全文索引时,要先看一下自己的MysQL版本、存储引擎和数据类型是否支持全文索引。
  • MySQL中的全文索引,有两个变量,最小搜索长度最大搜索长度,对于长度小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。通俗点就是说,想对一个词语使用全文索引搜索,那么这个词语的长度必须在以上两个变量的区间内。这两个的默认值可以使用以下命令查看: show variables like '%ft%'

使用全文索引

create table  t_article(
	id int primary key auto_increment,
	title varchar(255),
	content varchar(1000),
	writing_data date
	-- fulltext(content)  可以在这里创建全文索引,但是效率比较低 
)

insert into t_article values(null, "Yesterday Once NMore","when 1 was young 1 listen to the radi " , '2021-10-01');
insert into t_article values(null, "Right Here waiting" ,'oceans apart,day after day,and I slowly go insane',' 2021-10-02' );
insert into t_article values(null, "ly Heart will Go on", " every night in my dreams,i see you, i feel you",' 2021-10-03');
insert into t_article values(null, 'Everything I Do',' eLook into my eyes , vou will see what you mean to me' , '2021-10-04')
insert into t_article values(null, "called To Say I Love you","say love you no new yean 's day,to celebrate" ,'2021-10-05');
insert into t_article values(null, "Nothing s Gonna Change Ny Love For You","if i had to live my life without you nearme"," 2021-10-06");
insert into t_article values(null, "Everybody", "we 're gonna bring the flavor show U how." , '221-10-07');

-- 修改表结构
alter table t_article add fulltext index_content(content);

-- 添加全文索引
create fulltext index index_content on t_article(content);

-- 使用全文索引
select * from t_article where match(content) against('you') -- 有结果

select * from t_article where match(content) against('yo') -- 没结果

select * from t_article where content like '%you%';

空间索引

  • MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIs几何数据模型
  • 空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。
  • MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL。
  • 空间索引一般是用的比较少,了解即可。
     

内部原理

  1. 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。
  2. 换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

相关算法:

hash算法

二叉树算法

平衡二叉树

⭐Btree树算法

MylSAM引擎使用B+Tree

InnoDB引擎使用B+Tree

特点总结

优点

  1. ·大大加快数据的查询速度
  2. ·使用分组和排序进行数据查询时,可以显著减少查询时分组和排序的时间·创建唯一索引,能够保证数据库表中每一行数据的唯一性
  3. ·在实现数据的参考完整性方面,可以加速表和表之间的连接

缺点

  1. ·创建索引和维护索引需要消耗时间,并且随着数据量的增加,时间也会增加
  2. ·索引需要占据磁盘空间
  3. ·对数据表中的数据进行增加,修改,删除时,索引也要动态的维护,降低了维护的速度

使用原则

  1. 更新频繁的列不应设置索引
  2. 数据量小的表不要使用索引(毕竟总共2页的文档,还要目录吗? )
  3. 重复数据多的字段不应设为索引(比如性别.只右里和女,一般来说:重复的数据超过百分之15就不该建索引)
  4. 首先应该考虑对 where 和 order by 涉及的列上建立索引

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

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

相关文章

阿里二面:消息队列的事务消息可以用 TCC 模式实现吗?

大家好,我是君哥。 消息队列的主要功能是系统间解耦,实现流量的削峰填谷。主流的消息队列一般有三个核心操作:消费者发送消息,Broker 保存消息,消费者消费消息。如下图: 对于一个完整的事务消息&#xff0…

【Angular 开发】Angular 信号的应用状态管理

自我介绍 做一个简单介绍,年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【架构…

基于PaddleOCR银行卡识别实现(四)之uni-app离线插件

目的 在前三篇文章中完成了银行卡识别整个模型训练等工作,通过了解PaddleOCR的端侧部署,我们也可以将银行卡号检测模型和识别模型移植到手机中,做成一款uni-app手机端离线银行卡号识别的应用。 准备工作 为了不占用过多篇幅,这…

内存学习——堆(heap)

目录 一、概念二、自定义malloc函数三、Debug运行四、heap_4简单分析4.1 heap管理链表结构体4.2 堆初始化4.3 malloc使用4.4 free使用 一、概念 内存分为堆和栈两部分: 栈(Stack)是一种后进先出(LIFO)的数据结构&…

class072 最长递增子序列问题与扩展【算法】

class072 最长递增子序列问题与扩展【算法】 code1 300. 最长递增子序列 // 最长递增子序列和最长不下降子序列 // 给定一个整数数组nums // 找到其中最长严格递增子序列长度、最长不下降子序列长度 // 测试链接 : https://leetcode.cn/problems/longest-increasing-subsequen…

【Java 基础】29 序列化

文章目录 1.定义2.目的3.使用1)序列化2)反序列化 3.应用场景4.注意事项总结 1.定义 序列化(Serialization)是将对象的状态转换为字节流的过程,以便将其存储到文件、数据库或通过网络传输 说简单点,序列化就…

关于DNS服务器地址总是127.0.0.1且无法解析域名地址

问题 笔者尝试nslookup解释域名时,出现服务器变成本地环回口地址,导致无法解析域名 C:\Users\Zsy>nslookup www.baidu.com 服务器: UnKnown Address: 127.0.0.1*** UnKnown 找不到 www.baidu.com: Server failed排查思路 尝试关闭虚拟网卡&#…

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解? 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别,对于编写高效、可靠的SQL代码至关重要。今天,让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…

JS生成用户登录图形验证码

生成用户登录图形验证码的过程可以通过几个步骤来实现&#xff0c;包括创建画布&#xff0c;生成随机验证码文本&#xff0c;将验证码文本绘制到画布上&#xff0c;以及添加一些噪点和线条来增加复杂性。 HTML 首先&#xff0c;在HTML文件中创建一个<canvas>元素和一个…

c#生成二维码二维码中间添加定制LoGo

&#x1f680;介绍 &#x1f340;QRCoder是一个开源的.NET库&#xff0c;用于生成QR码&#xff08;Quick Response Code&#xff09;。这个库是用C#编写的&#xff0c;并且可以在.NET框架的各种版本上使用&#xff0c;包括.NET Framework, .NET Core, Mono, Xamarin等。QRCode…

深入解析Linux内核网络-拥塞控制系列(二)

上篇文章&#xff1a;深入解析Linux内核网络-拥塞控制系列(一&#xff09;对Linux内核网络中网络拥塞框架的框架进行了分析。本次针对具体的Cubic拥塞控制算法进行简单分析。在进行代码的梳理前&#xff0c;同样还是先来看一下相关概念、原理&#xff1a; 在上一篇文章中也提到…

电脑出现这些现象,说明你的固态硬盘要坏了

与传统机械硬盘&#xff08;HDD&#xff09;相比&#xff0c;固态硬盘&#xff08;SSD&#xff09;速度更快、更稳定、功耗更低。但固态硬盘并不是完美无瑕的&#xff0c;由于颗粒写入机制&#xff0c;可能会在七到十年的预期寿命之前出现故障。所以用户最好为最终故障做好准备…

vue3 自己写一个月的日历

效果图 代码 <template><div class"monthPage"><div class"calendar" v-loading"loading"><!-- 星期 --><div class"weekBox"><div v-for"(item, index) in dayArr" :key"index&q…

认识计算机的设备管理

在计算机系统中&#xff0c;除了处理器和内存之外&#xff0c;其他的大部分硬设备称为外部设备。它包括输入/输出设备&#xff0c;辅存设备及终端设备等。这些设备种类繁多&#xff0c;特性各异&#xff0c;操作方式的差异很大&#xff0c;从而使操作系统的设备管理变得十分繁杂…

数据仓库工具Hive

1. 请解释Hive是什么&#xff0c;它的主要用途是什么&#xff1f; Hive是一个基于Hadoop的数据仓库工具&#xff0c;主要用于处理和分析大规模结构化数据。它可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类似SQL的查询功能&#xff0c;将SQL语句转换为MapRedu…

使用 iperf 和 iftop 测试网络带宽

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

京东商品详情数据在数据分析行业中的重要性

京东商品详情数据在数据分析行业中具有重要作用。这些数据提供了丰富的信息&#xff0c;可以帮助企业了解市场趋势、消费者需求、产品表现以及运营策略等多个方面。 首先&#xff0c;京东商品详情数据可以为企业提供市场趋势分析的依据。通过观察商品的销售量、销售额、价格等…

Qt 6.5 类库实例大全:QObject

大家好&#xff0c;我是20YC小二&#xff01;福利时间&#xff1a;欢迎(wx)扫码关注&#xff0c;免费领取《C程序员入门必修第一课&#xff1a;C基础课程》在线视频教程&#xff0c;还有更多技术分享&#xff01;#下面进入今天内容# 1. QObject 介绍 QObject 是 Qt 库中最重要…

RocketMq集成SpringBoot(待完善)

环境 jdk1.8, springboot2.7.3 Maven依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/> <!-- lookup parent from…

C++学习笔记:继承

继承 什么是继承?继承的写法基类和派生类的赋值转换继承中的作用域派生类的默认成员函数单继承,多继承,虚拟继承is-a 和 has-a 什么是继承? 继承是C语言面向对象的三大特性之一&#xff0c;是面向对象程序设计使代码可以复用的最重要的手段,基本都是在一个类的基础上为了增加…