MYSQL之索引语法与使用

索引分类

分类               含义                                                     特点                                         关键字

主键索引    针对表中主键创建的索引                    默认自动创建,只能有一个          PRIMARY

唯一索引    避免同一个表中某数据列中的值重复  可以有多个                                   UNIQUE

常规索引    快速定位特定数据                               可以有多个        

全文索引    全文索引查找的是文本中的关键词      可以有多个                                   FULLTEXT

在InnoDB存储引擎中,根据索引的存储形式,又可分为以下两种:

分类                含义                特点            

聚焦索引    将数据存储与索引放到了一块,索引结构地 叶子节点保存了行数据    有且仅能有一个

二级索引    将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键     可以存在多个

聚焦索引选取规则:

如果存在主键,主键索引就是聚焦索引

如果不存在主键,将使用第一个唯一索引作为聚焦索引

如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚焦索引

select * form user where name=“Arm”;

利用二级索引找到对应聚焦索引(回表查询)然后找到对应数据

思考:

1、以下SQL语句,哪个执行效率高?为什么?

select * from user where id =10;

select * from user where name =‘arm’;

备注:id为主键,name字段创建的有索引

答:第一个语句执行效率高,因为执行第二个语句name字段是二级索引,还需要回表检索到聚焦索引,才能找到对应的数据。

2、InnoDB主键索引的B+Tree高度有多高?

假设:

一行数据的大小为1KB,一页(16K)中可以存储16行这样的数据。InnoDB的指针占用6个字节的空间,主键即使是bigint,占用的字节数为8。

树的高度为2可以存储的:

n*8+(n+1)*6=1024*16

主键:n = 1170

指针:n+1=1171

存储量(KB)1171*16=18736KB

树的高度为3可以存储:

1171*1171*16=21939856KB=21426MB=21GB

索引语法

创建索引

语法:

CREATE [UNIQUE|FULLTEXT]INDEX 索引名 ON 表名(被索引列名...);

案例

1、name字段为姓名字段,该字段的值可能会重复,为该字段创建索引

CREATE INDEX ON user1(name1);

2、phone手机号字段的值,是非空,且唯一,为该字段创建唯一索引

CREATE UNIQUE INDEX index_to_phone ON user1(phone);

3、为profession、age、status创建联合索引

CREATE INDEX idx_user_pro_age_sta  ON user1(profession,age,status);

4、为Email建立合适的索引来提升查询的效率

CREATE INDEX index_user_email ON user1(email);

查看索引

查看当前表所具有的索引:

show index from 表名;

删除索引

删除索引:

DROP INDEX 索引名 ON 表名;

SQL性能分析

SQL执行频率

MYSQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。

通过如下指令可以查看当前数据库的insert,update,delete,select的访问频次:

SHOW GLOBAL STATUS LIKE 'Com_______';

慢查询日志

慢查询日志记录所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。MYSQL的慢查询日志默认并没有开启,需要在MYSQL的配置文件:

C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

找到指定文件内,修改图下信息:

配置完成之后,通过以下指令重启MYSQL服务器进行测试,查看慢日志文件中记录的信息:C:\ProgramData\MySQL\MySQL Server 8.0\Data\**-slow.log

profiles详情

show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到是否支持profiles,yes是支持。

select @@have_profiling;

默认profiling默认是关闭的,通过set语句在session/global级别开启profiling

查询是否开启:select

0关闭1开启

设置开启

set @@profiling=1;

然后执行一系列sql语句之后

通过

show profiles;

查看各个sql语句的耗时。

查询SQL语句在各个阶段执行耗时情况

show profiles for query query_id;

查询指定query_id的SQL语句CPU的使用情况

show profiles cpu for query query_id;

explain执行计划

explain执行计划各字段的含义:

explain sql语句

索引的使用

验证索引效率

在未创建索引之前,执行SQL语句查看SQL的耗时

select * from tb_sku where sn ='10000002258';

耗时20.03s

针对字段创建索引

create index idx_sku_sn on tb_sku(sn);

然后再次执行相同的SQL语句,再次查看SQL的耗时情况。

select * from tb_sku where sn ='10000002258';

耗时0.00s

使用原则

索引失效
最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳过某一列,索引将部分失效(后面的字段索引失效)。

create full_text index idx_pro_age_sta on tb_user(profession,age,status);
# 走索引
explain select * from tb_user where profession="软件工程" and age=31 and status="0";
# 走索引
explain select * from tb_user where profession="软件工程" and age=31;
# 走索引
explain select * from tb_user where profession="软件工程";
# 走索引 status失效
explain select * from tb_user where profession="软件工程" and status="0";
# 不走索引
explain select * from tb_user where age=31 and status="0";
# 不走索引
explain select * from tb_user where status="0";
范围查询

联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效(规避办法加上>=)

# age后索引失效
explain select * from tb_user where profession="软甲工程" and age>60 and status='0';
# 规避办法
explain select * from tb_user where profession="软甲工程" and age>=60 and status='0';
索引列运算操作

不要在索引列进行运算操作,索引将失效

explain select * from tb_user where substring(phone,10,2)='15';
字符串类型不加引号

字符串类型的字段使用时,不加引号,索引将失效

explain select * from tb_user where profession="软甲工程" and age>=60 and status='0';
# status索引失效
explain select * from tb_user where profession="软甲工程" and age>=60 and status=0;
模糊查询

如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,索引失效。

# 走索引
explain select * from tb_user where profession="软甲工程";
# 走索引
explain select * from tb_user where profession like "软甲%" ;
# 不走索引
explain select * from tb_user where profession like "%工程";
or连接的条件

用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引豆瓣不会被用到。

解决办法:针对or条件后的字段建立索引

数据分布影响

如果MYSQL评估使用索引比全表更慢,则不使用索引

# 走全表扫描
select * from tb_user where phone>='190000005'
# 走索引
select * from tb_user where phone>='190000015'
SQL提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。

use index(给个建议)

explain select * from tb_user use index(idx_user_pro) where profession="软件工程";

ignore index(忽略)

explain select * from tb_user ignore index(idx_user_pro) where profession="软件工程";

force index(强制)

explain select * from tb_user force index(idx_user_pro) where profession="软件工程";
覆盖索引

尽量使用覆盖索引(查询使用了索引,并且要返回的列能在该索引中全部找到),减少select*(要回表查询,使性能下降)

注意:

using index condition:查找使用了索引,但需要回表查询数据

usingwhere;using index:查找使用了索引,但需要的数据在索引列能找到,不需要回表查询

思考题:

建立一个包含 username和password的联合索引

前缀索引

单列索引和联合索引

单列索引:一个索引包含一个列

联合索引:一个索引包含多个列

在业务场景中,如果存在多个查询条件,考虑针对查询字段建立索引时,建立联合索引,而非单列索引。

单列索引可能会回表查询

联合索引情况

设计原则

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

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

相关文章

【UE】在控件蓝图中通过时间轴控制材质参数变化

效果 步骤 1. 新建一个控件蓝图和一个材质 2. 打开材质&#xff0c;设置材质域为用户界面&#xff0c;混合模式设置为“半透明” 在材质图表中添加两个参数来控制材质的颜色和不透明度 3. 对材质创建材质实例 4. 打开控件蓝图&#xff0c;在画布面板中添加一个图像控件 将刚…

DC-8靶机做题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1jPMYoyFZXqr7sVMElHqGcw?pwdypq9 提取码&#xff1a;ypq9 参考&#xff1a; 【DC系列靶机DC8通关讲解】 https://www.bilibili.com/video/BV1R84y1H7rk/?share_sourcecopy_web&vd_source12088c392…

指针数组与数组指针

数组指针与指针数组 动态数组 扩容&#xff1a;空间不够&#xff0c;重新申请2倍大小的连续空间&#xff0c;拷贝元素后&#xff0c;释放旧空间 动态数组区别于静态数组&#xff0c;其不具备begin(),end()操作 //动态一维数组int n 10;int *a new int[n];//可以输入n值&…

(完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子

前言 自用生信代码&#xff0c; 花费一个多月写下来的。自学R以来第一次写600多行的代码。我的文章已经发表&#xff0c;如对您的研究有帮助希望可以引用一下。文章点我 SVM-RFE 主要是借助e1071包&#xff0c; 实现mSVM-REF识别并筛选关键基因&#xff0c;没有安装的小伙伴…

SpringBoot3(一)动力节点总结

目录 0、有用的新特性 一、Record 1.1、Record的介绍 1.2、Record的声明 1.3、Record的创建 0、有用的新特性 JDK8-19 新增了不少新特性&#xff0c;这里我们把实际常用的新特性&#xff0c;给大家介绍一下&#xff0c;包括以下几个方面&#xff1a; Java RecordSwich 开…

Gold-YOLO(NeurIPS 2023)论文与代码解析

paper&#xff1a;Gold-YOLO: Efficient Object Detector via Gather-and-Distribute Mechanism official implementation&#xff1a;https://github.com/huawei-noah/Efficient-Computing/tree/master/Detection/Gold-YOLO 存在的问题 在过去几年里&#xff0c;YOLO系列已经…

东南大学博士,华为上班5年,月薪达到4万4000,年终奖近10万

东南大学博士&#xff0c;华为上班5年&#xff0c;月薪达到4万4000&#xff0c;年终奖近10万 近日有华为员工爆料真实薪资&#xff0c;该网友是东南大学2018级博士&#xff0c;华为工作近5年&#xff0c;薪资达到4万4000&#xff0c;年终奖近10W。 该网友华为职场履历如下&am…

Qt6入门教程 10:菜单栏、工具栏和状态栏

目录 一.菜单栏 1.Qt Designer 1.1添加菜单和菜单项 1.2添加二级菜单 1.3给菜单和菜单项添加图标 1.4给菜单项添加功能 2.纯手写 二.工具栏 1.Qt Designer 1.1添加工具栏按钮 1.2工具栏的几个重要属性 2.纯手写 三.状态栏 1.Qt Designer 2.纯手写 用Qt Creator新…

iptables命令详解

简介 iptables 是 Linux 系统中用于配置 IPv4 数据包过滤规则的工具。它是 Linux 内核中 Netfilter 框架的一部分&#xff0c;通过设置规则&#xff0c;可以实现网络包的过滤、NAT 转发、端口映射等功能。 基本概念 表&#xff08;Tables&#xff09;&#xff1a; filter 表…

GPU与SSD间的P2P DMA访问机制

基于PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;总线连接CPU、独立GPU和NVMe SSD的系统架构。 在该架构中&#xff0c;PCIe Swicth支持GPU与SSD之间快速的点对点直接内存访问&#xff08;peer-to-peer, p2p DMA&#xff09;。通常情况下&#xff0…

Qt-QFileDialog保存文件及获取带扩展名的文件名

正确用法 QFileDialog dialog(this, "Save File", QDir::currentPath(), "Text Files (.txt)"); dialog.setAcceptMode(QFileDialog::AcceptSave); dialog.setDefaultSuffix("txt"); // << if (!dialog.exec())return; QString fileName …

latex添加图片以及引用的实例教程

原理 在 LaTeX 中插入图片&#xff0c;通常是使用 \includegraphics 命令&#xff0c;它是由 graphicx 包提供的。首先&#xff0c;确保在文档的前言部分&#xff08;\documentclass 之后和 \begin{document} 之前&#xff09;包含了 graphicx 包。 下面是一个基本的例子来展…

全志D1-H芯片Tengine支持

简介 ​ Tengine 是 OPEN AI LAB 推出的边缘 AI 计算框架&#xff0c;致力于解决 AIoT 产业链碎片化问题&#xff0c;加速 AI 产业化落地。Tengine 为了解决 AIoT 应用落地问题&#xff0c;重点关注嵌入式设备上的边缘 AI 计算推理&#xff0c;为海量 AIoT 应用和设备提供高性…

开始学习vue2基础篇(指令)

一、 内容渲染指令 > {{}} 模板渲染&#xff08;模板引擎&#xff09; 1. {{数据绑定}} 2. {{简单计算}} 3. {{简单逻辑运算}}&#xff08;三元运算&#xff09; 4. {{做简单 js 判断}} 注意&#xff1a;不能写语句、不能解析 html 渲染、不能放在在属性身上 > v-…

[小程序]页面的构建

一、视图容器组件 ①View 视图区域组件&#xff0c;类似于HTML中的div&#xff0c;可以用来按块实现页面布局效果&#xff0c;具体实例如下&#xff1a; <view class"dock"><view>A</view><view>B</view><view>C</view> &…

常用界面设计组件 —— 按钮组件、布局组件

2.4 按钮组件2.5 布局组件 2.4 按钮组件 QPushButton、QRadioButton 、QCheckBox都从 QAbstractButton&#xff0c;拥有一些共同的属性&#xff0c;如下图所 示&#xff1a; 图标使用setIcon()来设置&#xff0c;文本可以在构造函数或通过 setText()来设置。 可以使用 isCheck…

查看并解析当前jdk的垃圾收集器

概述&#xff1a;复习的时候&#xff0c;学看一下。 命令&#xff1a; -XX:PrintCommandLineFlags 打开idea&#xff0c;配置jvm 把上面命令输入jvm options中即可。 举例代码 这个代码的解析&#xff0c;我上篇文章有写&#xff0c;这个跟本文没有任何关系&#xff1a; …

C++--enum--枚举

C/C枚举类型&#xff1a; 不限定作用域的枚举类型 关键字&#xff1a;enum 声明枚举类型&#xff0c;然后可以用枚举类型来定义变量(如同结构体)&#xff1a; enum Color{white,black,yellow}; {注意分号} Color color_type; color_type 变量的值只限于枚举类型Color中的值 枚…

深度学习|RCNNFast-RCNN

1.RCNN 2014年提出R-CNN网络&#xff0c;该网络不再使用暴力穷举的方法&#xff0c;而是使用候选区域方法&#xff08;region proposal method&#xff09;创建目标检测的区域来完成目标检测的任务&#xff0c;R-CNN是以深度神经网络为基础的目标检测的模型 &#xff0c;以R-C…

Hikvision综合安防管理平台files;.css接口存在任意文件读取漏洞 附POC软件

免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. Hikvisi…