mysql数据库--索引

索引

1.索引

在数据中索引最核心的作用就是:加速查找

1.1 索引原理

索引的底层是基于B+Tree的数据存储结构

如图所示:

请添加图片描述

很明显,如果有了索引结构的查询效率比表中逐行查询的速度要快很多且数据越大越明显。

数据库的索引是基于上述B+Tree的数据结构实现,但在创建数据库表时,如果指定不同的引擎,底层使用的B+Tree结构的原理有些不同:

  • myisam 引擎,非聚簇索引(数据和索引结构分开索引)
  • innodb引擎,聚簇索引(数据和主见索引存储在一起)
myisam引擎(非聚簇索引)
create table 表名(id int(11) not null auto_increment primary key,name varchar(32) not null,age int
)engine=myisam default charset=utf8

在这里插入图片描述

innodb引擎(聚簇索引)
create table 表名(id int(11) not null auto_increment primary key,name varchar(32) not null,age int
)engine=innodb default charset=utf8

在这里插入图片描述

  • 常见的索引

在开发过程中常见的索引类型:

  • 主键索引:加速查找、不能为空,不能重复。+联合主键索引
  • 唯一索引:加速查找、不能重复。+联合唯一索引
  • 普通所以那就:加速查找。+联合索引

创建主键和联合主键索引

create table t1(id int not null auto_increment primary key,name varchar(32) not null
)default charset=utf8;create table t2 (id int not null auto_increment primary key,name varchar(32) not null
)default charset=utf8;create table t3(id int not null auto_increment,name varchar(32) not null,primary key (id,name))   --如果是多列,称为联合主键(不常用myisam引擎支持)
alter table 表名 add primary key (列名);
  • 删除索引时可能会报错,自增列必须定义为键。
alter table 表名 drop primary key;
[42000][1075] Incorrect table definition; there can be only one auto column and it must be defined as a key

唯一和联合唯一索引

#在创建表之前创建唯一索引create table unique_t1
(id    int         not null auto_increment primary key,name  varchar(32) not null,email varchar(64) not null,unique unique_name (name),unique unique_email (email)
) default charset = utf8;create table unique_t2
(id    int         not null auto_increment primary key,name  varchar(32) not null,email varchar(64) not null,unique unique_name_email (name, email)  -- 如果多列,联合唯一索引,也就是如果允许有一项是重复的,联合索引的列不全都重复即可
) default charset = utf8;# 在创建表后创建唯一索引 
create unique index unique_age on unique_t2 (age);
# 删除索引
drop  index unique_age on unique_t2;

索引和联合索引

create table index_t1
(id    int         not null auto_increment primary key,name  varchar(32) not null,email varchar(64) not null,index index_name (name)
) default charset = utf8;create table index_t2
(id    int         not null primary key,name  varchar(16) not null,email varchar(32) not null,age   int(11)     not null,index index_name_email (name, email)
) default charset = utf8;create index index_t1_age on index_t2(age);drop index index_t1_age on index_t2;

命中索引

  • 类型不一致
select * from resume_library where 姓名=123;  --没有命中索引
select * from resume_library where 位置=123;    --没有命中索引select * from  resume_library where r_id = '3000000';   -- 命中索引
  • 使用不等于
select * from resume_library 姓名!=于金龙;-- 未命中
select * from resume_library email !=yujinlong2002@outlook.com;-- 未命中# 主键有特殊情况(resume_library的id列是表的主键)
select * from resume_library where id = 10; -- 命中索引🎯
  • or,当or条件中有未建立索引的列才有效(id:主键,name 有索引 ,email 没有索引)
select * from tb where id = 213 or email='xxxxxx@xxxx.com'
-- 未命中
select * from tb where email='xxxxxx@xxxx.com' or name='阿龙的代码在报错';   未命中特殊情况
select * from tb where id = 213 or email='xxxxxx@xxxx.com' and name='阿龙的代码在报错' -- 命中 🎯
  • 排序,当根据索引进行排序的时候,选择的映射如果不是索引,那么就不走索引
select * from tb order by name asc -- 未命中
select * from tb order by name desc -- 未命中
select name  from tb order by name desc  -- 命中🎯特殊情况:(id 是主键)
select * from tb where order by id desc -- 命中🎯
  • like,模糊匹配时
select * from tb where name like "%代码在报错";  -- 未命中
select * from tb where name like "阿龙%在报错";  -- 未命中
select * from tb where name like "_龙在报错";  -- 未命中特别的(通配符在最后面可以命中)
select * from tb where name like "阿龙的代码%"  -- 命中🎯
select * from tb where name like "于%"
  • 使用函数
select * from tb where reverse(name)="阿龙的代码在报错";  -- 未命中
特殊的情况:
select * from tb where name=reverse("阿龙的代码在报错") -- 命中🎯
  • 最左前缀原则,如果是联合索引,要遵循最左前缀原则
如果是联合索引未(id,name,age)id and name -- 命中🎯
id    -- 命中🎯
name  -- 未命中
id or name  --未命中
name and age --未命中

以上是数据库索引中比较常见的无法命中索引的情况,如果有错误或者不规范的地方希望各位大佬指正

  • 最左前缀原则,如果是联合索引,要遵循最左前缀原则
如果是联合索引未(id,name,age)id and name -- 命中🎯
id    -- 命中🎯
name  -- 未命中
id or name  --未命中
name and age --未命中

以上是数据库索引中比较常见的无法命中索引的情况,如果有错误或者不规范的地方希望各位大佬指正

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

硬件(驱动开发概念)

驱动程序开发 裸机驱动(无操作系统) Linux驱动 以计算机技术为基础,在软件和硬件层间可以被剪裁的专业硬件计算机系统 SOC:片上系统 Kernel:内核 x86 (CISC:complex instruction set computer 复杂指令…

一款前后端分离CRM客户关系管理系统,支持客户,商机,线索,合同,发票,审核,商品等功能(附源码)

前言 在当今竞争激烈的商业环境中,企业面临着各种挑战,其中包括如何更有效地管理和跟进潜在客户以提高销售业绩。传统的客户管理方式往往效率低下,无法实时更新客户-信息,导致销售机会流失。因此,市场上急需一款能够简…

GitHub 上高星 AI 开源项目推荐

FIFO-Diffusion 介绍:FIFO-Diffusion 是一个创新的开源项目,它能够基于文本描述生成无限长度的高品质视频,而无需任何预先的模型训练。这一技术的核心在于其高效的内存管理策略和先进的扩散模型,使得即使是小型GPU配置也能轻松应…

ES学习笔记

目录 简介 原理 基础概念 lucene总结 es的进步 实现过程 写入流程 搜索过程 和Mysql搭配 学习来源:https://i12pc3nf6d.feishu.cn/wiki/FnPwwGXGli1ANGkaMz5chvhmn2e#share-OYKJdYhehotnMgxrBiUcZSJJnCb https://i12pc3nf6d.feishu.cn/wiki/FnPwwGXGli1ANG…

【Linux】【Hadoop】大数据基础实验一

实验一:熟悉常用的Linux操作和Hadoop操作 一、实验目的 Hadoop运行在Linux系统上,因此,需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作和Hadoop操作,为顺利开展后续其他实验奠定基础。 二、实验平台 操作系统…

comp 9517 Computer Vision week2

图像处理 1.空间域操作(Spatial domain operation)1.1 点(Point operation)1.2 邻域(Neighbourhood operation)空间滤波(spatial filtering)修复边界问题(fixing the border problem)通过卷积进行空间滤波(Spatial filtering by convolution)卷积特性:滤波器强度梯度…

Java 缓存机制与缓存失效

在分布式系统中,缓存 是提高系统性能、减轻数据库压力的常用技术。合理的缓存策略不仅能提升响应速度,还能节省资源。不过,缓存并不是万能的,缓存失效 是开发中必须考虑的问题。如果处理不好,可能会导致数据不一致或性…

使用库函数点亮一个LED灯

软件设计 STM32Gpio的介绍 如果想让LED0点亮,那么R12就要是高电平,LED0就要是低电平,也就是PF9就是低电平 F407系统主频要工作在168MHZ F103的话是工作在72mhz F429的话就180MHZ 接着我们就要使能Gpio的时钟,使能之后对GPIO相关…

YOLOV8输出预测框的坐标信息

结果:(前提是对应类别的yolov8模型已经训练好) 具体实现: 在ultralytics\utils\plotting.py里面 CtrlF搜索box_label 再次照片的最后一行输入: # 左上角cv2.putText(self.im, f"({p1[0]}, {p1[1]})", (p1…

19.初始C语言指针

初始C语言指针 1.指针的认识2.指针变量的引入3.指针变量的类型4.指针的应用场景15.指针的应用场景26.作业 1.指针的认识 指针 地址 //int a 10; //类型 变量名 内存地址 值 1.变量名直接访问2.通过地址访问&:取地址运算符* :将地址内的值读取…

Nacos未授权下载配置信息

0x01 漏洞描述: Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos存在未授权文件下载,攻击者在不登录情况下可未授权下载系统配置文件。 攻击者利用该漏洞可未授权获取到系统配置文件,如数据库和Redis连接地址…

【Delphi】创建应用程序和 LiveBindings示例(FMX)

一、创建一个FMX程序 界面上放置上如下3个控件:TProgressBar1, TArcDial1,TTrackBar1。 二、打开LiveBindings Designer 设计器 三、在 LiveBindings Designer 中,您的绑定图只包含对象,您可以将它们连接起来。 四、在设计器中,在…

openFrameworks_如何使用ofxXmlSettings和ofxGui来创建识别界面

效果图: 代码及详解 1.添加两个插件的头文件: #include "ofxGui.h" #include "ofxXmlSettings/src/ofxXmlSettings.h" 2.添加GUI部分,然后在.h声明右边的openframeworks的UI部分,包括面板ofxPanel,按钮ofx…

Tomcat 漏洞复现

1、CVE-2017-12615 1、环境开启 2、首页抓包,修改为 PUT 方式提交 Tomcat允许适用put方法上传任意文件类型,但不允许isp后缀文件上传,因此需要配合 windows的解析漏洞 3、访问上传的jsp文件 4、使用工具进行连接 2、后台弱⼝令部署war包 1…

简单了解一下SurfaceView

0 背景 最近好几次面试被问到SurfaceView的特点了,都没回答出来。 SurfaceView和TextureView也是Compose这样的声明式ui唯二实现不了控件;因为他们就不是View,而是Android提供的和Surface相关的显示系统 。 特此简单了解一下。 1 应用场景…

【Godot4.3】点数据简易表示法和Point2D

概述 在构造多点路径时我们会用到PackedVector2Array,并使用Vector2()来构造点。在手动创建多点数据时,这种写法其实很难看,有大量重复的Vector2(),比如下面这样: var points [Vector2(100,100),Vector2(200,200),V…

[Python]二、Python基础数据科学库(1)

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\2、机器学习核心技术\1、零基础快速入门机器学习 1.机器学习概述 1.1 人工智能概述 1.1.1 人工智能与机器学习、深度学习 1956年-达特茅斯会议-人工智能的起点 人工智能和机器学习、深度学习的关系: 1. 机器学习…

软考(9.22)

1 在浏览器的地址栏中输入xxxyftp.abc.can.cn,在该URL中( )是要访问的主机名。 A.xxxyftp B.abc C.can D.cn 协议://主机名.域名.域名后缀或IP地址(:端口号)/目录/文件名。 本题xxxyftp是主机名,选择A选项。 2 假设磁盘块与缓冲区大小相同,…

Django基础-创建新项目,各文件作用

学习Django的前置知识: python基本语法:需要掌握Python中的变量、循环、条件判断、函数等基本概念。面向对象编程(OOP):Django的核心架构基于面向对象编程,许多功能(如模型和视图)依…

【无人机设计与控制】 基于matlab的蚁群算法优化无人机uav巡检

摘要 本文使用蚁群算法(ACO)优化无人机(UAV)巡检路径。无人机巡检任务要求高效覆盖特定区域,以最小化能源消耗和时间。本研究提出的算法通过仿生蚁群算法优化巡检路径,在全局搜索和局部搜索中平衡探索与开…