【MySQL】Sql优化之索引的使用方式(145)

索引分类

1.单值索引
单的意思就是单列的值,比如说有一张数据库表,表内有三个字段,分别是 id name numberNo,我给name 这个字段加一个索引,这就是单值索引,因为只有name 这一列是索引;

一个表可以有多个单值索引,我不光可以设置name ,我也可以把numberNo设置成索引,或许更多;

2.唯一索引
顾名思义,就是不能重复,比如age就不能被设置为唯一索引,因为年龄肯定是不唯一的,小明18岁,有可能小李也是18岁,这就重复了,所以age这一列不能被设置成唯一索引;

一般唯一索引就是Id;

3.复合索引
由多个列构成,相当于书的二级目录,比如我找“小敏”,它就先去X里面找,然后再去xiao里面去找,找两次;

这个时候我把name跟numberNo它两个共同组成一个复合索引,意思就是,我先根据name找人,如果名字重复了,我再根据numberNo去找;

复合索引不一定必须两个列在一起使用,比如找小婷,这个表里面就一个小婷,就没有必要再去找numberNo进行筛选;

如图:表:student_data

在这里插入图片描述
创建索引的方式一:
语法:careate 索引类型 索引名 on 表 (字段)

1.创建单值索引:单值索引索引类型就是index;
CREATE INDEX name_index ON student_data(NAME)

1.1查看索引:
SHOW INDEX FROM student_data
在这里插入图片描述
2.创建唯一索引:创建的该字段值必须唯一
CREATE UNIQUE INDEX numberNo_index ON student_data(numberNo)

讲解:unique 与 index 都是索引类型,这里我们就假设name是唯一的,创建方法跟上面一样,无非就多加了一个unique,去掉unique就是单值索引;

3.创建复合索引
CREATE INDEX name_numberNo_index ON student_data(NAME,numberNo)
//程序会自动检测,如果你后面参数只有一个,那就判定你为单值,如果是一个以上,就判定你是复合!

3.1 查看索引:
SHOW INDEX FROM student_data在这里插入图片描述

3.2查看索引执行计划:EXPLAIN 在这里插入图片描述
4.删除索引:
DROP INDEX name_index ON student_data

5.查看索引:
SHOW INDEX FROM student_data
在这里插入图片描述
SQL性能问题
1.分析SQSL的执行计划:EXPLAIN
通过explain,可以模拟SQL优化器执行SQL语句,从而让开发人员知道自己编写的状况;
查询执行计划:explain+SQL语句;
EXPLAIN SELECT * FROM student_data
在这里插入图片描述
id:顾名思义就是查询编号

select_type:查询类型

table:你在操作哪一张表

type:类型

key:实际使用的索引,你到底用了哪些索引

possible_keys:预测你用到了哪些索引,假设你用了八个索引,它这里就会显示八个,但是实际有效的只有五个,所以在key显示就是五个!

key_len:实际使用索引的长度;

ref:表和表之间的引用关系;

rows:通过索引查询到的数据量;

Extra:额外的优化信息

创建索引的方式二:

语法:alter table 表名 索引类型 索引名(字段)
1.创建单值索引
ALTER TABLE student_data ADD INDEX name_index(NAME);
查看索引
SHOW INDEX FROM student_data
在这里插入图片描述
2.创建唯一索引
ALTER TABLE student_data ADD UNIQUE INDEX numberNo_index(numberNo)
讲解:照猫画虎,跟上放基本一致,假设numberNo字段是唯一不可重复

3.创建复合索引
ALTER TABLE student_data ADD INDEX name_numberNo_index(NAME,numberNo)

讲解:先NAME就是先根据NAME查,再去根据numberNo查,这个顺序是有意义的!
值得注意的是,两个创建方式的效果是一样的,任选其一,均不需要事物的提交(commit),因为两者都是DDL语句,程序遇到DDL会自动提交,但是你写了也不报错,就是什么也没提交而已;
事物只对DML语句进行操作,也就是增删改操作,这个需要理解!

注意:

如果一个字段是primary key(主键),则该字段默认就是主键索引,即便你没有给他加索引,他也是主键索引!

主键索引与唯一索引基本相似,区别就是,值不能为Null,而唯一索引可以!

主键索引:值不能重复 值不能为null

唯一索引:值不能重复 值可以为null

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

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

相关文章

3d游戏公司选择云电脑进行云办公有哪些优势

随着游戏行业的不断发展,很多的游戏制作公司也遇到了很多的难题,比如硬件更换成本高、团队协同难以及效率低下等问题,那么如何解决游戏行业面临的这些行业痛点,以及游戏制作公司选择云电脑进行云办公有哪些优势?一起来…

Axure中如何使用交互样式交互事件交互动作情形

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《产品经理如何画泳道图&流程图》 ⛺️ 越努力 ,越幸运 目录 一、Axure中交互样式 1、什么是交互样式? 2、交互样式的作用? 3、Axure中如何…

【HarmonyOS开发】ArkUI实现下拉刷新/上拉加载

列表下拉刷新、上拉加载更多,不管在web时代还是鸿蒙应用都是一个非常常用的功能,基于ArkUI中TS扩展的声明式开发范式实现一个下拉刷新,上拉加载。 上拉加载、下拉刷新 如果数据量过大,可以使用LazyForEach代替ForEach 高阶组件-…

Leetcode—128.最长连续序列【中等】

2023每日刷题&#xff08;六十四&#xff09; Leetcode—128.最长连续序列 实现代码 class Solution { public:int longestConsecutive(vector<int>& nums) {unordered_set<int> s;for(auto num: nums) {s.insert(num);}int longestNum 0;for(auto num: s) …

Linux Mint 21.3 代号为“Virginia”开启下载

Linux Mint 团队今天放出了 Linux Mint 21.3 Beta ISO 镜像&#xff0c;正式版计划在今年圣诞节发布。 支持 在实验性支持 Wayland 之外&#xff0c;Cinnamon 6.0 版 Linux Mint 21.3 Beta 镜像还带来了其它改进&#xff0c;Nemo 文件夹管理器右键菜单支持下载相关操作。 Cin…

C++相关闲碎记录(17)

1、IO操作 &#xff08;1&#xff09;class及其层次体系 &#xff08;2&#xff09;全局性stream对象 &#xff08;3&#xff09;用来处理stream状态的成员函数 前四个成员函数可以设置stream状态并返回一个bool值&#xff0c;注意fail()返回是failbit或者badbit两者中是否任一…

STM32Fxx HAL库开发UART中断回调函数理解-中断回调函数流程-自己理解的

STM32HAL库中断服务函数调用过程有2种 第1种&#xff1a;可以直接在中断源对应的中断服务函数中编写我们想要的功能 具体是在void USART1_IRQHandler(void&#xff09;函数写要执行的任务 正点原子是重新宏定义函数名&#xff0c;写法如下&#xff1a; 暂时忽略&#xff0c;…

如何通过控制台排查定位EasyTsdb

过去我们发现EasyTsdb占用磁盘较大&#xff0c;但我们却不能直接看到哪个模型占用空间多&#xff1f;更不可能知道是哪个指标数据量大&#xff1f; 当EasyTsdb负载高时&#xff0c;我们无法定位当时哪个模型或者哪个请求占用了资源&#xff0c;也不知道是从什么时候开始出现高…

ansible的脚本------playbook剧本

playbook组成部分&#xff1a; 1.task 任务&#xff1a;包含要在目标主机上执行的操作&#xff0c;使用模块定义这些操作。每个都是一个模块的调用。2.variables 变量&#xff1a;存储和传递数据。变量可以自定义&#xff0c;可以在playbook当中定义为全局变量&#xff0c;也可…

AI for Science 塑造多学科研究新范式!欢迎参加 WAVE SUMMIT+2023深度学习开发者大会平行论坛

在人工智能飞速发展中&#xff0c;大模型已经崭露头角&#xff0c;引领了新一轮的技术潮流。大模型&#xff0c;凭借其对复杂模式和关系的深度理解能力&#xff0c;展现出在科学研究中的巨大应用潜能。通过大模型&#xff0c;科学家们能更深入地揭示科学现象的内在规律&#xf…

Docker 核心技术

Docker 定义&#xff1a;于 Linux 内核的 Cgroup&#xff0c;Namespace&#xff0c;以及 Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;属于操作系统层面的虚拟化技术&#xff0c;由于隔离的进程独立于宿主和其它的隔离的进程&#xff0c;因此也称其为容器Docke…