MySQL数据库中的索引知识

MySQL数据库中索引的作用是用来加快数据的查询速度。

索引  index(表的层面)

在数据库中使用select来查询数据的时候会一条一条得去查询符合要求的数据,而索引就相当于在这张表中依据某一个字段的数值给这张表的数据创建了一个目录。目录帮助我们快速的去定位数据。

在表中创建索引的时候要挑选合适的字段来创建索引,如果为这张表创建的索引挑选的字段不合适的话,此时依据索引查询数据的速度不增反降。

如上图所示,在实际应用场景中我们需要依据一段时间之内用户的行为来将合适的字段创建索引。

如果说在一段时间以内,用户常常根据商品的价格来搜索商品,此时我们就需要将这张表的索引创建在价格从字段上。此时数据库会自动按照价格的数值来进行相应的排序,然后生成一个目录。

如果用户的搜索行为发生改变的话,此时我们就需要将原来表中的索引删除,重新创建一个索引。

在创建索引的时候不适合将索引创建在数据经常需要发生变动的字段上。

注意点:1.不适合在经常变动的数据上建立索引。

2.建立在合适的字段上{根据前端业务的用户行为}

MySQL数据库默认会在主键字段上自动创建索引,

查看表的索引

如上图所示,在MySQL数据库中使用SQL语句show index from 表的名称;

来查看这张表的索引,此时MySQL数据库软件会给出一个表,在这张表中有一行内容就代表有一个索引,一般在MySQL数据库中都会有这样一个默认行为即自动为拥有主键属性的字段去创建索引。

创建索引

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
    [index_type]
    ON tbl_name (key_part,...)
    [index_option]
    [algorithm_option | lock_option] ...

如上图所示,是使用help create index;在MySQL数据库上去查询如何创建索引的SQL语句。

即如果想去在一张表的某一个字段上去创建索引,就需要使用语句

create index 自己起的索引名称

on 表的名称(表的字段名称,表的字段名称);

如上图所示,在使用show index from 表名称;的表格中的key_name是索引的名称。

如上图所示,使用SQL语句create index 创建的索引名称 on 表的名称 (字段名称);

可以在表中创建索引,使用show index from 表的名称;

在日常工作中,MySQL数据库工作人员常常使用字段_key的方式来为创建的索引命名。

删除索引

如上图所示,使用命令drop index 索引名称 on 表名称

验证索引对加快搜索数据的帮助

在MySQL内部有一个查询分析器的东西。这个查询分析器可以帮助我们分析select语句是如何帮助获取到数据的。

explain就是MySQL中的查询分析器。

如上图所示,key的结果可以说明在使用select语句查询表中信息的时候是否使用到了索引,当为null的时候表示没有使用到索引。而rows表示使用select语句调查表中的信息的时候调查了表的多少行数据。

如上图所示,当在表中使用语句create index 索引名称 on 表(字段名称);

使用explain select * from 表名称 where 条件;

可以查看到select语句的执行过程。

什么情况下的select语句是不能触发字段的索引的?

当你写的select语句触发了数据类型转换的时候,就不能触发索引。

如上图所示,当使用select语句中使用了比较查询的时候,或者在等值查询的时候使用了“5000”这种将字符串=数字,的数据类型转换的时候同样不能触发索引。

在SQL语句中使用select语句去查询数据的时候什么情况是用不到索引的?

在使用SQL的SELECT语句查询数据时,以下情况可能不会使用索引,从而可能影响查询性能:

  1. 全表扫描更快: 当表中的数据量非常小,全表扫描比使用索引进行查找更快时,数据库可能选择不使用索引。

  2. 使用函数或表达式: 在查询条件中,如果对索引列使用了函数、表达式或计算(如DATE(create_time)age - 1),这通常会导致索引失效。

  3. 不等于(!=)和NOT IN操作符: 使用!=NOT IN操作符可能导致索引不被使用,特别是当这些操作符与其他条件结合使用时。

  4. 类型不匹配: 如果查询条件中的数据类型与索引列的数据类型不一致,可能导致索引失效。

  5. LIKE操作符以通配符开头: 如果LIKE子句以通配符(如'%abc')开头,索引通常不会被利用,因为这要求对列的每一项做全值比较。

  6. OR条件: 当查询条件中包含多个通过OR连接的条件时,除非每个条件的列都有索引且优化器选择使用这些索引,否则索引可能不会被利用。

  7. 多列索引未使用第一列: 对于复合索引(多列索引),如果查询条件没有首先使用索引的第一列,索引可能不会被使用。

  8. 索引列参与计算: 在条件中,如果对索引列进行了数学运算(+,-,*,/,!)或其他计算,索引可能不会被使用。

  9. 字段编码不一致: 在关联查询中,如果关联字段的字符编码不一致,可能导致索引失效。

  10. 索引覆盖未满足: 如果查询需要从表中检索大量数据,而不仅仅是索引包含的列(即没有实现索引覆盖),数据库可能决定放弃使用索引而进行全表扫描。

了解这些情况有助于在设计查询和索引策略时做出更优化的选择,以提高查询效率。

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

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

相关文章

江协科技51单片机学习- p11 静态数码管显示

前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用: 51单片机入门教程-2…

如何处理Android应用程序的内存泄漏

如何处理Android应用程序的内存泄漏 在Android开发中,内存泄漏是一个常见且重要的问题。当应用程序不再需要某些对象时,但由于某种原因这些对象仍然被引用,导致它们不能被垃圾回收器(Garbage Collector)回收&#xff…

Cesium中的线性代数和计算机图形学知识介绍

目录 前言1.基础介绍1.1 线性代数1.1.1 向量 (Vectors)1.1.2 矩阵 (Matrices)1.1.3 四元数 (Quaternions) 1.2 计算机图形学1.2.1 投影变换 (Projection Transformations)1.2.2 视图变换 (View Transformations)1.2.3 模型变换 (Model Transformations)1.2.4 光照与着色 (Light…

Java 面试题:强引用、软引用、弱引用、幻象引用有什么区别?

在 Java 中,理解不同类型引用的区别对于掌握内存管理和垃圾回收机制是至关重要的。强引用、软引用、弱引用和幻象引用分别提供了不同的对象引用强度,使开发者能够精细控制对象的生命周期和内存使用情况。 强引用(Strong Reference&#xff09…

rapidjson使用中crash问题分析

问题 在使用rapidjson时,使用Document的Parse方法解析json字符串,程序crash。 分析 可以参考https://github.com/Tencent/rapidjson/issues/1269,由于rapidjson的内存分配器默认认为内存分配成功,没有对分配后做判空判断&#…

35.简易远程数据框架的实现

上一个内容:34.构建核心注入代码 34.构建核心注入代码它的调用LoadLibrary函数的代码写到游戏进程中之后无法调用,动态链接库的路径是一个内存地址,写到游戏进程中只把内存地址写过去了,内存地址里的内容没写过去,导致…

Netty ByteBuf 使用详解

文章目录 1.概述2. ByteBuf 分类3. 代码实例3.1 常用方法3.1.1 创建ByteBuf3.1.2 写入字节3.1.3 扩容3.1.2.1 扩容实例3.1.2.2 扩容计算新容量代码 3.1.4 读取字节3.1.5 标记回退3.1.6 slice3.1.7 duplicate3.1.8 CompositeByteBuf3.1.9 retain & release3.1.9.1 retain &a…

Jmeter5.X性能测试【完整版】

目录 一、Http基础协议和解析 1、浏览器的B/S架构和C/S架构 (1)CS架构 (2)BS架构 (3)URL理解 2、Http超文本传输协议 (1)含义 # 协议 # json协议 # xml协议 (…

分布式锁(Redission)

分布式锁: 使用场景: 通常对于一些使用率高的服务,我们会进行多次部署,可能会部署在不同的服务器上,但是他们获取和操作的数据仍然是同一份。为了保证服务的强一致性,我们需要对线程进行加锁,…

WRONGPASS invalid username-password pair or user is disabled

连接redis客户端的时候报错:WRONGPASS invalid username-password pair or user is disabled 当前redis版本为7.2.4 一、问题分析 默认情况下,Redis 7.0 使用默认用户名 default 和空密码进行身份验证。如果未设置 requirepass,则默认用户名…

C++实现自动生成c++类中的属性的get和set方法

目录 应用场景 运行准备 代码展示 结果显示 应用场景 当我们在编写类的属性时,需要对该属性进行封装,需要一系列的get和set的方法。例如下面是天气类的成员属性。可以看到属性很多,而写get和set都是一些固定的操作,因此可以直…

任务4.8.4 利用Spark SQL实现分组排行榜

文章目录 1. 任务说明2. 解决思路3. 准备成绩文件4. 采用交互式实现5. 采用Spark项目实战概述:使用Spark SQL实现分组排行榜任务背景任务目标技术选型实现步骤1. 准备数据2. 数据上传至HDFS3. 启动Spark Shell或创建Spark项目4. 读取数据5. 数据转换6. 创建临时视图…

哈夫曼树及其应用

目录 一、哈夫曼树 1.1基本概念 1.2构造方法 1.3构造算法的实现 二、哈夫曼树的应用 2.1哈夫曼编码 2.2文件的编码和解码 2.2.1编码 2.2.2解码 一、哈夫曼树 1.1基本概念 哈夫曼树又称为最优树,是一类带权路径长度最短的树。 最优二叉树:带权…

Android内核编译

前言 本文描述使用Ubuntu 编译Android内核刷入pixel4一些心得和流程。 PC信息: ./o- jackjackyyyyy- -yyyyyy OS: Ubuntu 22.04 jammy:////-yyyyyyo Kernel: x86_64 Linux 6.5.0-35-generic. .://-.sss/ Uptime: 1d 5h 4m.:o: //:--:/- …

Java 时间日期类API

Java 关于日期时间API 文章目录 Java 关于日期时间APIJDK8之前System类的方法java.util.DateJava.sql.Datejava.text.SimpleDateFormatjava.util.Calendar(日历) JDK8.0,新日期时间APIjava.timeInstant 瞬时与传统日期处理的转换 Java中关于日期时间API分为JDK8之前…

C++入门 vector部分模拟实现

目录 vector大致框架 vector常见接口模拟实现 begin迭代器 & end迭代器 capacity( ) & size( ) reserve operator[ ] push_back( ) & pop_back( ) sort vector大致框架 vector的内部的成员变量大概有三部分构成&#xff1a; namespace bit {template<c…

【Java算法】滑动窗口 上

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 &#x1f456;一. 长度最小的子数组 题目链接&#xff1a;209.长度最小的子数组 算法原理 滑动窗口 滑动窗口算法常用于处理数组/字符串等序列问题&#xff0c;通过定义一…

Java赋值运算符

Java赋值运算符分为以下&#xff1a; 符号 作用 说明 赋值 int a 10,把10赋值给变量a 加后赋值 ab,将ab的值赋值给变量a - 减后赋值 a-b,将a-b的值赋值给变量a* 乘后赋值 a*b,将a*b的值赋值给变量a / 除后赋值 a/b,将a/b的值赋值给变量a % 取余赋值 a%b,将a%b的值赋值给变量…

力扣84.柱状图中最大的矩形

力扣84.柱状图中最大的矩形 初始化pre_max 为-1 存距离最近的小于h[i]的元素下标 初始化suf_max 为 n 存距离最近的小于h[i]的元素下标 class Solution {public:int largestRectangleArea(vector<int>& heights) {int n heights.size();//分别初始化-1 和 nvect…

C#循环语句总结

前言 正所谓磨刀不误砍柴工&#xff0c;C#上位机软件开发能力的提升离不开对C#语法的精通&#xff0c;本文接着讲解C#语法知识中的循环语句&#xff0c;在C#程序开发中我们经常会用到各种循环语句&#xff0c;常见的有for循环、while循环&#xff0c;本文就是对C#中用到的各种…