MySQL索引(三)

news2024/11/22 19:51:05

MySQL索引(三)

文章目录

  • MySQL索引(三)
    • 为什么建索引?
    • 怎么建立索引
      • 为什么不是说索引越多越好
      • 什么时候不用索引更好
    • 索引怎么优化
    • 索引失效
      • 如何解决索引失效

学习网站:https://xiaolincoding.com/

为什么建索引?

1.索引大大减少了MySQL需要扫描的数据量

如果没有建立索引,查数据的时间复杂度是O(n),查询效率低下;建立索引后,B+树是个多叉树,搜索的时间复杂度是O(logN),提高查询效率

2.索引帮助MySQL避免外部排序和使用临时表

3.将随机IO转变为顺序IO

索引是把数据顺序存放,这样可能相邻的数据会存储到一个连续的磁盘空间,这样就有可能是顺序IO了

怎么建立索引

适用于索引:

1.字段具有唯一性限制的,比如商品编码,id

2.经常使用==WHERE条件==的字段,如果是多个就创建联合索引

3.经常用于==GROUP BYORDER BY==的字段,这样在查询的时候就不用去做一次排序了,因为建立索引后在B+树中的记录是排序好的

不适应于索引的:

1.WHEREGROUP BYORDER BY中用不到的字段,不起到定位作用的字段不需要建立索引,因为索引也消耗物理空间

2.字段中大量重复数据,比如性别字段。因为MySQL中的查询优化器发现某个值在该字段占比很高,就会忽略索引,进行全表扫描

3.经常更新的字段不用创建索引,因为索引字段频繁更新,需要去维护B+树的有序性,频繁的重建索引会影响数据库性能

为什么不是说索引越多越好

  • 空间消耗:索引占用物理空间,数量越大,占据空间越大

多一个索引,就多一个B+树索引,表数据量越大,索引占用空间越大

  • 时间消耗:降低表的增删改查的效率,每次增删改查,B+树都需要维护索引有序性,进行动态维护

什么时候不用索引更好

建立索引就会有时间和空间上的消耗,见上文。

1.如果一个表经常被增删改的话,也就是读多写少场景下,不建立索引更好,因为维护索引的开销可能大于索引提升的性能

2.如果某个字段中的值高度重复,建立索引也没有用,查询优化器会选择全表扫描,这样建立的索引既占空间,也影响增删改的效率

索引怎么优化

  • 覆盖索引优化:

比如商品名和商品价格:select pro_id,pro_name,pro_price from table where pro_name="apple;",把商品名和商品价格建立一个联合索引,这使用使用上面的sql语句就利用覆盖索引优化了,因为索引中已经包含这两个字段的数据了,所以查询不会再次去查询主键索引,避免了回表,减少大量IO操作

  • 主键索引最好是自增的

如果是随机值,会造成页分裂,页分裂会导致大量内存碎片,使索引结构不紧凑,影响查询效率

  • 避免索引失效

1.使用左或左右模糊匹配会造成索引失效,like %xx like %xx%

2.当我们在查询条件中对索引列进行计算、函数、类型转换操作时都会造成索引失效

3.联合索引必须遵守最左匹配原则

4.WHERE字句中,如果OR前的条件列是索引列,OR后的条件列不是索引列,也会造成索引失效

  • 前缀查询优化

对于一些大字符串的索引,我们可以考虑使用前缀索引只对索引列的前缀部分建立索引,节省索引的存储空间

索引失效

如果用varchar定义一个日期字段,并且其中有个数据"20120101",如果这个time字段有索引,并且查询时的条件是where time=20120101不加单引号,会不会命中索引?

答案是不会。

因为MySQL在遇到字符串和数字比较时,会把字符串先转化为数字,然后进行比较。也就是对字符串执行一个CAST函数。

比如:

select* from table_name where time=20120101

实际上执行的是select* from table_name where CAST(time AS signed int)=20120101

索引字段进行了函数计算就会发生索引失效。

反过来,如果一个id字段是整型类型,查询的id=“1”,就不会发生索引失效

select* from table_name where id="1"

实际上执行的是select* from table_name where id=CAST("1 AS signed int")

索引字段并没有发生函数计算,所以不会索引失效

如何解决索引失效

MySQL8.0:函数索引和索引跳跃扫描机制

  • 函数索引

针对函数计算后的值建立一个索引,也就是该索引的值是函数计算后的值,这样就可以通过扫描索引来查询数据

比如:针对length(name)的计算结果建立一个索引

alter table t_user add key idx_name_length((length(name)))
explain select * from t_user where length(name)=6;

这时候就走索引了

image-20240828205738853

  • 索引跳跃扫描机制

之前使用联合索引时,如果不满足最左匹配原则会造成索引失效,8.0有了索引跳跃扫描机制之后,即使没有遵循最左匹配原则,任然可以使用联合索引

image-20240828210001059

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

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

相关文章

io进程中进程的创建,回收,退出

目录 一丶什么是进程 1.概念 2.特点 3 进程段 4.进程分类 5.进程状态 6.进程状态切换图 7.进程相关命令 8.优先级调度 二丶进程函数接口 1.创建进程fork() 2.进程回收wait() 3.结束进程exit() 4.获取进程号getpid(),getppid() 5.exec函数族 6.守护进程 特点&a…

AI辅助创作全攻略:如何高效利用人工智能撰写各类作品文字

在数字化时代的浪潮中人工智能(AI)已经渗透到咱们生活的方方面面,其中就包含文学创作领域。辅助创作不仅可以加强写作效率还能激发创作灵感宽创作视野。 那么怎么样高效利用人工智能撰写各类作品文字呢?本文将为您详细解析这一全攻…

软件测试 | 测试用例

测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境,测试步骤,测试数据,预期结果等要素。 设计测试用例原则⼀: 测试用例中⼀个必需部分是对…

进程间通信:采用有名管道,创建两个发送接收端,父进程写入管道1和管道2,子进程读取管道2和管道1.

作业1&#xff1a;有名管道&#xff0c;创建两个发送接收端&#xff0c;父进程写入管道1和管道2&#xff0c;子进程读取管道2和管道1. 右进程 #include <myhead.h> int main(int argc, const char *argv[]) {pid_t pidfork();if(pid>0)//父进程&#xff0c;将数据发…

PHP软件下载-安装-环境配置

.1.下载 下载地址如下 windows.php.net - /downloads/releases/ 安装包如下. .2.安装 可以在D盘或者E盘的根目录创建一个自定义目录。注意文件夹目录中不能包含中文&#xff0c;不能包含空格等特殊字符。 版本说明&#xff1a; (1)ts表示非线程安全版本。这个安装包还指明了…

easypoi实现ftl转doc文档(循环填充数据)

1.pom文件 java <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency><!-- EasyPoi依赖 --><dependency><groupId>cn.afterturn</groupId><artifactId>easypo…

【生日视频制作】室内告白表白祝福布置霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】

室内告白表白祝福布置霓虹灯生日视频制作教程AE模板改字生成器 怎么如何做的【生日视频制作】室内告白表白祝福布置霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

select epoll搭建并发式服务器

select 在C语言中&#xff0c;使用select函数可以创建一个并发式服务器。select是一个系统调用&#xff0c;它允许服务器同时监视多个文件描述符&#xff08;如套接字&#xff09;&#xff0c;以便知道哪个文件描述符准备好了进行读取或写入操作。这使得服务器能够同时处理多个…

Python简介、发展史

Python简介、发展史 本文目录&#xff1a; 零、时光宝盒 一、Python简介 二、Python设计者 三、Python发展史 四、Python语言的编程语言特性 五、Python现状 六、Python的未来 零、时光宝盒 我家所在的楼是3栋楼连接在一起的建筑&#xff0c;也就是3栋楼楼顶建筑上互通。…

学习笔记——后端项目中的相关技术 【随时更新】

文章目录 1. Session 共享1.0 cookie和session的工作流1.1 Cookie范围1.2 为什么要共享&#xff1f;1.3 如何共享存储1.4 session共享实现 1. Session 共享 1.0 cookie和session的工作流 在 Web 开发中&#xff0c;Cookie 和 Session 是非常常见的&#xff0c;尤其是在处理用…

使用 Java 在 Android 平台上通过 socket 实现进程间通信

引言 Socket是位于应用层和传输层之间的一个抽象层&#xff0c;把TCP/IP层复杂的操作抽象为几个简单的接口&#xff0c;供应用层调用以实现进程在网络中通信。 Socket分为流式套接字和数据包套接字&#xff0c;分别对应网络传输控制层的TCP协议和UDP协议。TCP协议是一种面向连…

Qt之界面优化

目录 前言 QSS基础知识 选择器 样式属性 控件样式⽰例 绘图 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 前言 Qt 仿照CSS的模式,引⼊了QSS,来对Qt中的控件做出样式上的设定,从⽽允许程序猿写出界⾯更好看 的代码.当然,由于Q…

【面试题系列Vue05】跟其他人不太一样的 Vue生命周期总结

既然要讲 生命周期&#xff0c;那渲染过程得先了解下。 数据绑定 Vue 文本插值 在 Vue 中&#xff0c;最基础的模板语法是数据绑定&#xff0c;例如&#xff1a; <div>{{ data }}</div>这里绑定了一个 msg 的变量&#xff0c;开发者在 Vue 实例 data 中绑定该变…

DataWhale AI夏令营-《李宏毅深度学习教程》笔记-task2

DataWhale AI夏令营-《李宏毅深度学习教程》笔记 第四章 卷积神经网络卷积神经网络构成一个通俗的例子 第四章 卷积神经网络 这部分看书的时候感觉云里雾里的&#xff0c;好在之前学过一些卷积神经网络、全链接、感受野的概念&#xff0c;我就用自己的理解阐述一篇笔记吧&…

idea插件开发(一)合并检查

一、引言 由于代码合并冲突的时候&#xff0c;代码丢失的情况频发&#xff0c;作者研究idea的VFS虚拟文件系统和Git4ide源码&#xff0c;创作idea插件检测代码合并丢失 可以区分主动删除与被动丢失&#xff0c;比如本地或者删除一段代码&#xff0c;合并之后不会被认为是丢失…

华为云 x 容联云|828企业节,助推中国数智产业实力再升级

2024年8月27日&#xff0c;华为第三届828 B2B企业节在2024中国国际大数据产业博览会上正式开幕。 828 B2B企业节是全国首个基于数字化赋能的企业节&#xff0c;由华为联合上万家生态伙伴共同发起&#xff0c;旨在为广大企业尤其是中小企业搭建数字化创新发展平台&#xff0c;融…

C语言基础(二十二)

在C语言中&#xff0c;对链表进行排序涉及到比较链表中的节点值&#xff0c;并根据比较结果重新排列这些节点。由于链表是非连续存储的数据结构&#xff0c;其排序比数组排序要复杂一些。由链表的结构特性可知&#xff0c;插入排序和归并排序更适合链表排序。 测试代码1&#…

力扣之1853.转换日期格式

文章目录 1. 1853.转换日期格式1.1 题干1.2 建表1.3 题解1.4 实现方式1.5 题解1.6 知识总结 1. 1853.转换日期格式 1.1 题干 表: Days ----------------- | Column Name | Type | ----------------- | day | date | ----------------- day 是这个表的主键。 给定一个Days表&…

基于Spring Boot的陶瓷文化网站的设计与实现

毕业设计&#xff08;论文&#xff09; 论文题目&#xff1a;基于Spring Boot的陶瓷文化网站的设计与实现 博主可接毕设论文&#xff01;&#xff01;&#xff01; 摘 要 中国悠久的陶瓷艺术&#xff0c;作为民族文化遗产的重要载体&#xff0c;历经时代的洗礼&#xff0c;其…

kube-scheduler组件的启动流程与源码走读

概述 摘要&#xff1a;kube-scheduler是kubernetes系统中的重要组件&#xff0c;kub-scheduler 的核心职责是为待调度的 pod 寻找一个最合适的 node 节点, 然后进行 bind node 绑定, 后面 kubelet 才会监听到并创建真正的 pod。kub-scheduler本身是一个功能强大且负责的核心组…