当前位置: 首页 > news >正文

Mysql索引,聚簇索引,非聚簇索引,回表查询

什么是索引

        数据库索引是为了实现高效数据查询的一种有序的数据数据结构,类似于书的目录,通过目录可以快速的定位到想要的数据,因为一张表中的数据会有很多,如果直接去表中检索数据效率会很低,所以需要为表中的数据建立索引,这样就会提高效率。

索引优势

  1. 通过索引可以快速定位到数据,降低IO次数,提升效率
  2. 排序列添加索引,也可以提高提高排序的效率,因为索引是有序的。

索引劣势

  1. 索引保存也需要占用空间
  2. 增删改数据时,数据发生变化,索引也需要做出相应的改变,也是需要时间开销的

索引创建原则

  • 什么时候需要创建索引

  1. 主键自动建立唯一索引
  2. 作为查询条件的字段应该创建索引(where 后面的语句中包含的字段)
  3. 尽量使用联合索引,减少单列索引
  4. 针对数据量较大,且查询比较频繁的表建立索引
  5. 查询中排序的字段,分组中的字段,若通过索引去访问将大大提高排序速度
  • 什么时候不需要创建索引

  1. 表记录太少,例如类型表,员工职位表等
  2. 增删改频率高的表
  3. 查询条件中没有
  4. 唯一性差,例如性别,只有男和女两种值

索引分类

  • 主键索引

        创建表时,设置哪个列为 primary key ,主键列默认自动创建索引

# 创建主键索引方式1, 创建表时直接添加主键索引
create table 表名(id int primary key
);# 创建主键索引方式2, 表创建完成后, 修改表添加主键索引
create table 表名(id int
);
alter table 表名 add primary key 表名(id) ;
# 删除主键索引
alter table 表名 drop primary key;
  • 唯一索引

        设置某个列数据唯一性,会创建唯一索引

# 创建唯一索引方式1, 创建表时直接添加唯一索引
create table 表名(id int primary key auto_increment, -- 创建表时直接设置主键account varchar(20) unique
);# 创建唯一索引方式2, 表创建完成后, 修改表添加唯一索引
create table 表名(id int,account varchar(20)
);
create unique index index_unique_account on 表名(account);
# 删除索引, 非主键索引
drop index index_unique_account ON 表名;
  • 单值索引

        一个索引中,只包含一个列

# 创建索引
create index index_name on 表名(列名);# 删除索引, 非主键索引
drop index index_name ON 表名;
  • 组合索引(复合索引)

        一个索引中包含多个列,节省了索引开支

create table t(a int,b int,c int
);# 创建组合索引
create index index_t_a_b on t(a, b);# 删除索引, 非主键索引
drop index index_t_a_b ON t;

在查询时,如果使用组合索中包含的字段引作为查询条件,必须要包含组合索引中的第一个列,如在上述索引 index_t_a_b ,如果在查询时不使用a作为查询条件会导致索引失效。

通过 explain 可以查看查询时是否是由索引

# 索引生效
explain select * from t where a='' and b='';
explain select * from t where b='' and a='';

# 索引生效
explain select * from t where a='' and c='';

# 索引失效
explain select * from t where b='' and c='';

  • 前缀索引

        有些列长度比较大,需要给前面置顶的长度的区间添加索引即可。

create index 索引名 on 表名(列名(长度));
  • 全文索引

        模糊查询时,即使有索引也可能出现索引失效的情况

CREATE TABLE t(id INT PRIMARY KEY  AUTO_INCREMENT,title VARCHAR(100)
);INSERT INTO t(title)
VALUES
('小明没考上中学'),
('李华没考上大学'),
('我四级没过')CREATE INDEX title_index_t ON t(title);# 索引生效
EXPLAIN SELECT * FROM t WHERE title LIKE '小明%'

# 索引失效
EXPLAIN SELECT * FROM t WHERE title LIKE '%没考%'

# 创建全文索引
CREATE FULLTEXT INDEX title_index_t ON t(title) WITH PARSER ngram;# 索引生效
EXPLAIN SELECT * FROM t WHERE MATCH(title) AGAINST('没考')

聚簇索引和非聚簇索引

区分方式:找到了索引是否就找对应的数据,找到是聚簇索引,没有找到事非聚簇索引

  • 聚簇索引

        找到索引就找到了对应的数据,即索引和数据的存储是在一起的

  • 非聚簇索引

        索引的存储和数据的存储是分离的,在myisam引擎中,由于索引和数据分别存储在两个不同的文件中,找到了索引,还需要重新查找一次才能找到数据。

        innodb引擎中,像普通的索引也称为二级索引,他们也是非聚簇索引,例如为名字(name)创建索引(主键索引为以及索引),通过名字查找到id后,需要到主键索引树中找到对应的数据也是非聚簇索引。

回表查询

回表查询指的是查询时查询的次数不止一次

例:现在有表t结构如下:

  1. 通过id查询学生的所有信息,这时只需要查询一次即可,因为主键索引是聚簇索引,查询到id就找到了对应行的数据
    SELECT * FROM t WHERE id = 1;
  2. 通过学号查询学生所有的信息,此时需要回表查询,因为根据学号找到后没有直接找到对应的其他数据(非聚簇索引)
    SELECT * FROM t WHERE stu_no = '1001';
  3. 通过学号查询学生的学号,此时不需要回表查询,因为我们所需要的数据已经在学号的索引树上找到了,此时也是聚簇索引,没有回表查询操作。
    SELECT stu_no FROM t WHERE stu_no = '1001';

    这样的查询方式用于查看数据库中是否包含这个学号。

相关文章:

Mysql索引,聚簇索引,非聚簇索引,回表查询

什么是索引 数据库索引是为了实现高效数据查询的一种有序的数据数据结构,类似于书的目录,通过目录可以快速的定位到想要的数据,因为一张表中的数据会有很多,如果直接去表中检索数据效率会很低,所以需要为表中的数据建立…...

【优选算法 二分查找】二分查找算法入门详解:二分查找小专题

x 的平方根 题目解析 算法原理 解法一&#xff1a; 暴力解法 如果要求一个数(x)的平方根&#xff0c;可以从 0 往后枚举&#xff0c;直到有一个数(a)&#xff0c;a^2<x&#xff0c;(a1)^2>x&#xff0c;a即为所求&#xff1b; 解法二&#xff1a;二分查找 …...

如何将CSDN博客下载为PDF文件

1.打开CSDN文章内容 2.按键盘上的f12键&#xff08;或者右键—审查元素&#xff09;进入浏览器调试模式&#xff0c;点击控制台&#xff08;Console&#xff09;进入控制台 3.在控制台输入以下代码&#xff0c;回车 4.在弹出的打印页面中将布局设置成横向&#xff0c;纵向会…...

pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具

一、简介 MinerU是开源、高质量的数据提取工具&#xff0c;支持多源数据、深度挖掘、自定义规则、快速提取等。含数据采集、处理、存储模块及用户界面&#xff0c;适用于学术、商业、金融、法律等多领域&#xff0c;提高数据获取效率。一站式、开源、高质量的数据提取工具&…...

2024年下半年网络工程师案例分析真题及答案解析

2024年下半年网络工程师案例分析真题及答案解析 试题一(15分) [说明] 公司为某科技园区的不同企业提供网络服务,不同企业的业务有所不同,每个企业因业务需要在不同的地点有多个分支机构。其拓扑结构如图1所示。企业用户通过楼层接入交换机、楼栋汇聚交换机和区域交换机接…...

English phonetic symbol

英语音标发音表-英语48个音标在线读 (jiwake.com) 【英语音标教程】从此学会国际音标|英式音标|BBC音标教程全解_哔哩哔哩_bilibili 元音 单元音 /iː/,/ɪ/ 这两个音不是发音长短的区别&#xff0c; /uː/ /ʊ/ 上面那个就正常读&#xff0c;下面那个她的气大概是往你斜…...

普及组集训--图论最短路径设分层图

P4568 [JLOI2011] 飞行路线 - 洛谷 | 计算机科学教育新生态 可以设置分层图&#xff1a;(伪代码&#xff09; E(u,v)w;无向图 add(u,v,w),add(v,u,w); for(j1~k){add(ujn,vjn,w);add(vjn,ujn,w);add(ujn-j,vjn-j,0);add(vjn-j,ujn-j,0); } add(ujn-j,vjn-j,0); add(vjn-j,uj…...

SYN6288语音合成模块使用说明(MicroPython、STM32、Arduino)

模块介绍 SYN6288中文语音合成模块是北京宇音天下科技有限公司推出的语音合成模块。该模块通过串口接收主控传来的语音编码后&#xff0c;可自动进行自然流畅的中文语音播报。 注&#xff1a;SYN6288模块无法播报英文单词和句子&#xff0c;只能按字母播报英文 &#xff1b;而…...

Spring完整知识三(完结)

Spring集成MyBatis 注意 Spring注解形式集成MyBatis时&#xff0c;若SQL语句比较复杂则仍采用映射文件形式书写SQL语句&#xff1b;反之则用注解形式书写SQL语句&#xff0c;具体可详见Spring注解形式 环境准备相同步骤 Step1&#xff1a; 导入相关坐标&#xff0c;完整pom.…...

保姆级教程Docker部署Redis镜像

目录 1、创建挂载目录和配置文件 2、运行Redis镜像 3、查看redis运行状态 1、创建挂载目录和配置文件 # 创建宿主机Redis配置文件存放目录 sudo mkdir -p /data/docker/redis/conf# 创建Redis配置文件 cd /data/docker/redis/conf sudo touch redis.conf 到Github上找到Redi…...

子类有多个父类的情况下Super不支持指定父类来调用方法

1、Super使用方法 super()函数在Python中用于调用父类的方法。它返回一个代理对象&#xff0c;可以通过该对象调用父类的方法。 要使用super()方法&#xff0c;需要在子类的方法中调用super()&#xff0c;并指定子类本身以及方法的名称。这样就可以在子类中调用父类的方法。 …...

AI大模型ollama结合Open-webui

AI大模型Ollama结合Open-webui 作者:行癫(盗版必究) 一:认识 Ollama 1.什么是Ollama ​ Ollama是一个开源的 LLM(大型语言模型)服务工具,用于简化在本地运行大语言模型,降低使用大语言模型的门槛,使得大模型的开发者、研究人员和爱好者能够在本地环境快速实验、管理和…...

RK3568笔记2:NOR_Flash和NAND_Flash与SDMMC和eMMC

1. 本质区别 特性NOR Flash/NAND FlashSDMMC/eMMC定义基础存储器&#xff08;原始闪存芯片&#xff09;基于闪存芯片的存储模块&#xff0c;带有控制器组成结构只有原始存储芯片存储芯片 控制器控制方式需主机直接控制&#xff0c;读写逻辑由主机完成内置控制器&#xff0c;主…...

windows python qt5 QChartView画折线图

环境&#xff1a;windows pyqt5 &#xff0c;用QCartView画折线图 环境需要提前安装 pip install PyQtChart 折线图随着时间推移会不断移动&#xff0c;主动更新x轴坐标 import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout from PyQt5.QtChart imp…...

阿里云通义千问:全面解析智能云服务先锋

一、技术架构与基础 模型构建基石 采用大规模语料库训练&#xff0c;涵盖多领域知识&#xff0c;如科学、历史、文学等&#xff0c;确保知识储备丰富多样。运用先进的神经网络架构&#xff0c;深度优化模型结构&#xff0c;提高信息处理效率与准确性。持续的语料更新机制&…...

QT 贪吃蛇

1.注意点 新new对象时&#xff0c;要food->show(),否则屏幕不显示 setText() 要求字符串 事件的触发必须写在QWidget中或这是他的子类才能触发&#xff0c;snake.cpp继承的是QTimer 产生动态的原因是定时器每间隔一秒执行一次 信号可以定义在别的.cpp中&#xff0c;只要连接…...

二、点亮希望之光:寄存器与库函数驱动 LED 灯

文章目录 一、寄存器1、存储器映射2、存储器映射表3、寄存器4、寄存器映射5、寄存器重映射6、总线基地址、外设基地址、外设寄存器地址7、操作寄存器&#xff08;以操作一个GPIO口为例&#xff09;1. 寄存器地址定义部分2. GPIOD_Configuration 函数部分3. main 函数部分 二、库…...

Oracle 用户管理模式下的恢复案例-不完全恢复

1. 不完全恢复的几种常用方法 01. recover database using backup controlfile 如果丢失当前控制文件&#xff0c;用冷备份的控制文件恢复的时候&#xff0c;用来告诉 oracle&#xff0c;不要以 controlfile 中的 scn 作为恢复的终点&#xff1b; 02. recover database until …...

SharpDevelop IDE IViewContent.cs类

文件位置&#xff1a;IViewContent.cs /// <summary>/// IViewContent is the base interface for "windows" in the document area of SharpDevelop./// A view content is a view onto multiple files, or other content that opens like a document/// (e.…...

Unity RectTransUtility工具类

这个工具主要是用于动态生成UI的情况。项目中我们通过配置UI的锚点、位置以及大小(位置、大小都是通过蓝湖看到的)&#xff0c;然后通过代码动态生成UI。 大部分情况下只要合理设置锚点&#xff0c;那么生成出来的UI就已经满足了适配的要求。 using UnityEngine;public static…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...