Mysql-索引应用
目录
索引应用
MySQL有哪些索引?
普通索引和唯一索引有什么区别? 哪个更新性能更好? 、
聚簇索引的主键索引怎么设置? 追问:假如你不设置会怎么样?
我们一般选择什么样的字段来建立索引?
索引越多越好吗?
索引怎么优化? (覆盖索引优化、防止索引失效、主键递增、前缀索引优化)
建立了索引,查询的时候一定会用到索引吗? (索引失效、优化器基于成本选择执行计划)
如果我定义了一个varchar类型的日期字段,并且有一个数据是‘20230922’,如果这个日期字段上有索引,那如果我查询的where条件是where time=20230922不加单引号,还会命中索引吗? 为什么?
MySQL最新版本解决了索引失效的哪些情况了吗? (函数索引:函数计算后的值也能走索引、索引跳跃扫描机制(最左前缀))
什么是最左匹配原则?
建立联合索引有什么需要注意的? (区分度大的放在最左侧,最左匹配原则、范围查询后的不走索引)
最左匹配原则查询顺序
索引下推是什么? MySQL5.6 添加的,用于优化数据查询
where a>1 and b=2 and c <3 怎么建立索引?
(A,B,C) 联合索引 select * from tbn where a=? and b in (?,?) and c>? 会走索引吗?
where a>100 and b=100 and c=123 order by d 怎么建立联合索引?
select id ,name from XX where age > 10 and name like‘xx%’,有联合索引(name,age) ,说一下查询过程
索引应用
MySQL有哪些索引?
我了解到 MySQL有主键索引、唯一索引、普通索引、前缀索引、联合索引这几种索引。
Innodb 引擎会要求每一张数据库表都必须要有一个主键索引,索引列的值不允许有空值。比如表里的 id 字段就是主键索引
唯一索引: 保证数据列中每行数据的唯一性,但允许有空值。
然后针对查询比较频繁的字段,我们可以对这个字段建立普通索引,如果是多个字段的话,可以考虑建立联合索引,利用索引覆盖的特性提高查询效率。
对于长文本、字符串等类型的字段,比如文章标题、商品名称等,我们可以只对这些字段的前缀部分建立索引,也就是建立前缀索引,这样可以减少索引的存储空间。
普通索引和唯一索引有什么区别? 哪个更新性能更好? 、
-
查询单个值时,唯一索引可能略快,因为它在找到第一个匹配项后可以终止搜索。
-
插入和更新操作,普通索引可能略快,因为它不需要进行唯一性检查。
-
普通索引列的值是可以重复的,而唯一索引列的值是必须唯一的,当我们对唯一索引插入了一条重复的值,会因为唯一性约束而报错。
-
我认为普通索引的更新性能会更好,因为普通索引在更新的时候,如果更新的数据页不在内存的话,可以直接把更新操作缓存在 change buffer 中,更新操作就结束了。(不需要唯一性检查)
-
但是,唯一索引因为需要有唯一性约束,如果更新的数据页不在内存的话,需要从磁盘读取对应的数据页到内存,判断有没有冲突,这里会涉及磁盘随机IO的访问。
-
普通索引因为能使用change buffer 特性,所以普通索引的更新相比于唯一索引,减少了随机磁盘访问,所以更新性能更好
聚簇索引的主键索引怎么设置? 追问:假如你不设置会怎么样?
InnoDB在创建聚簇索引时,会根据不同的场景选择不同的列作为索引:
-
如果有主键,默认会使用主键作为聚簇索引的索引键
-
如果没有主键,就选择第一个不包含 NULL值的唯一列作为聚簇索引的索引键
-
在上面两个都没有的情况下,InnoDB将自动生成一个隐式自增rowid列作为聚簇索引的索引键
我们一般选择什么样的字段来建立索引?
适用索引的场景:
-
字段有唯一性限制的,比如商品编码
-
经常用于WHERE查询条件的字段,这样能够提高整个表的查询速度,如果查询条件不是一个字段,可以建立联合索引
-
经常用于GROUPBY和ORDER BY的字段,这样在查的时候就不需要再去做一次排序了,因为建立索引之后在 B+ Tree 中的记录都是排序好的。
不适合索引的场景
-
WHERE条件,GROUP BY,ORDER BY 里用不到的字段,索引的价值是快速定位,如果起不到定位的字段通常是不需要创建索引的,因为索引是会占用物理空间的。
-
区分度低的字段,不需要创建索引,比如性别字段只有男女,如果数据库表中,男女的记录分布均匀,那么无论搜索哪个值都可能得到一半的数据。在这些情况下,还不如不要索引,因为 MySQL还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。
-
频繁更新的字段,比如不要对电商项目的用户余额建立索引,因为索引字段频繁修改,由于要维护 B+Tree的有序性,那么就需要频繁的重建索引,这个过程是会影响数据库性能的。
-
不建议用无序的值(例如身份证、UUID )作为索引,当主键具有不确定性,会造成叶子节点频繁分裂,出现磁盘存储的碎片化
-
数据表较小:当表中的数据量很小,或者查询需要扫描表中大部分数据时,数据库优化器可能会选择全表扫描而不是使用索引。在这种情况下,维护索引的开销可能大于其带来的性能提升。
索引越多越好吗?
不是的,索引虽然能提高查询效率,但是多建立一个索引,就意味着新生成一个 B+树索引,是需要占用存储空间的,特别是在表数据量非常大的时候,索引占用的空间越大
索引越多,数据库的写入性能会下降,因为每次对表进行增删改操作的时候,都需要去维护各个 B+ 树索引的有序性
索引怎么优化? (覆盖索引优化、防止索引失效、主键递增、前缀索引优化)
我用过这几种优化的方式
-
对于需要查询几个字段数据的 SQL 来说,我们可以对这些字段建立联合索引,这样查询方式就变成了覆盖索引,避免了回表,减少了大量的I/O 操作。
-
我们的主键索引最好是递增的值,因为我们索引是按顺序存储数据的,如果主键的值是随机的值,可能会引发页分裂的现象,页分裂会导致大量的内存碎片,这样索引结构不紧凑了,就会影响查询效率。
-
我们要避免写出发生索引失效的 SQL 的语句,比如不要对索引列进行左或者左右模糊匹配、不要对索引进行计算、函数、类型转换操作,联合索引要能正确使用要遵循最左匹配原则等等。在WHERE子句中,如果在OR 前的条件列是索引列,而在OR 后的条件列不是索引列,那么索引会失效。
使用不等于(
<>
)或者 NOT 操作符:这些操作符通常会使索引失效,因为它们会扫描全表。OR 操作符:如果查询条件中使用了 OR,并且 OR 两边的条件分别涉及不同的索引,那么这些索引可能都无法使用。
使用
OR
操作符时,如果OR
两边的条件涉及不同的索引,数据库引擎在大多数情况下无法同时使用多个索引来优化查询。这是因为OR
操作符要求满足任意一边的条件即可,这增加了查询优化的复杂性。
-
对于一些大字符串的索引,我们可以考虑用前缀索引只对索引列的前缀部分建立索引,节省索引的存储空间,提高查询性能。
-
索引最好设置为 NOT NULL:为了更好的利用索引,索引列要设置为 NOT NULL 约束。有两个原因:
-
索引列存在 NULL 就会导致优化器在做索引选择的时候更加复杂,更加难以优化 如count操作
-
NULL 值是一个没意义的值,但是它会占用物理空间,存在null值列,至少会用 1 字节空间存储 NULL 值列表
-
建立了索引,查询的时候一定会用到索引吗? (索引失效、优化器基于成本选择执行计划)
不是的。
-
我了解到即使查询使用到了索引,也是可能不走索引的
-
比如:当我们查询语句对索引字段进行左模糊匹配、表达式计算、函数、隐式类型转换操作,这时候查询语句就无法走索引了,查询方式就变成了全表扫描的方式。
-
还有我们使用联合索引进行查询的时候,如果没有遵循最左匹配原则,也是会发生索引失效的。
-
-
优化器是基于成本考虑来选择查询的方式,在使用二级索引进行查询的时候,优化器会计算回表的成本和全表扫描的成本,如果回表的代价太高,优化器会选择不走索引,而是走全表扫描
如果我定义了一个varchar类型的日期字段,并且有一个数据是‘20230922’,如果这个日期字段上有索引,那如果我查询的where条件是where time=20230922不加单引号,还会命中索引吗? 为什么?
不会命中索引。
因为 mysql在遇到字符串和数字比较的时候,会发生隐式类型转换,会将字符串的对象转为数字,这个转换的过程实际上会涉及到函数。你说的这个查询,日期字段是字符串,那么发生隐式类型转换的时候,就会作用在日期这个索引字段上,对索引进行函数计算的话,是会发生索引失效的。
对于整型类型的索引列,例如
id
列,它的值是直接存储在索引中的,而不会发生函数计算。这意味着在查询中使用id
进行匹配时,不需要对id
进行任何函数计算或转换,只是简单地比较整数值。
MySQL最新版本解决了索引失效的哪些情况了吗? (函数索引:函数计算后的值也能走索引、索引跳跃扫描机制(最左前缀))
我了解到 MySQL8.0可以给字段增加函数索引,这个新特性可以解决对索引使用函数的时候,索引失效的问题。
还有一个新特性是索引跳跃式扫描,5.7 版本之前,使用联合索引的时候,如果不满足最左匹配原则,就会发生索引失效,而 8.0出了索引跳跃式扫描特性之后,即使没有遵循最左匹配原则,依然可以使用联合索引。
什么是最左匹配原则?
假设有一个(a,b,c) 联合索引,它的存储顺序是先按 a 排序,在 a 相同的情况再按b 排序,在 b 相同的情况再按 c 排序。由于这个特性,在使用联合索引时,存在最左匹配原则,具体的规则:
-
MySQL的联合索引会从最左边的索引列开始匹配查询条件,然后依次从从左到右的顺序匹配,如果查询条件没有使用到某个列,那么该列右边的所有列都无法使用走索引。
-
当查询条件中使用了某个列,但是该列的值包含范围查询,范围查询的字段可以用到联合索引,但是在范围查询字段的后面的字段无法用到联合索引。
所以,我们在使用联合索引的时候,要遵守最左匹配原则,否则可能会出现部分索引字段走不了索引。
建立联合索引有什么需要注意的? (区分度大的放在最左侧,最左匹配原则、范围查询后的不走索引)
-
最好把区分度比较大的字段放在联合索引最左侧,有助于提高索引的过滤效果,比如UUID 这类字段就比较适合做索引或排在联合索引列的靠前的位置。
-
如果区分度很低的字段放在了联合索引最左侧,有可能会导致查询优化器会选择全表扫描,而不走索引了。
-
联合索引的最左匹配原则,在遇到范围查询(如 >、<)的时候,就会停止匹配,也就是范围查询的字段可以用到联合索引,但是在范围查询字段后面的字段无法用到联合索引。但是,对于 >=、<=、BETWEEN、like 前缀匹配这四种范围查询,并不会停止匹配。
-
在 MySQL 中,BETWEEN 包含了 value1 和 value2 边界值,类似于 >= and =<。
-
参考链接 https://zhuanlan.zhihu.com/p/573138586
-
最左匹配原则查询顺序
select * from T where c=1 and a=2 and b=3;
abc都能走索引,因为 where 查询条件字段的顺序并不会影响,MySQL优化器会帮我们调整字段的查询顺序所以也是符合最左匹配原则的。
索引下推是什么? MySQL5.6 添加的,用于优化数据查询
索引下推能够减少二级索引在查询时的回表操作,提高查询的效率,因为它将 Server 层部分负责的事情,交给存储引擎层去处理了。
-
不使用索引条件下推优化时存储引擎通过索引检索到数据,然后返回给 MySQL Server,MySQL Server 进行过滤条件的判断。
-
当使用索引条件下推优化时,如果存在某些被索引的列的判断条件时,MySQL Server 将这一部分判断条件下推给存储引擎,然后由存储引擎通过判断索引是否符合 MySQL Server 传递的条件,只有当索引符合条件时才会将数据检索出来返回给 MySQL 服务器。
索引条件下推优化可以减少存储引擎查询基础表的次数,也可以减少 MySQL 服务器从存储引擎接收数据的次数。
select * from t_user where age > 20 and reward = 100000;
where a>1 and b=2 and c <3 怎么建立索引?
-
创建(abc)、(acb)、(ab)、(ac)联合索引,只有 a 能索引
-
创建(cab)、(cba)、(ca)、(cb)联合索引,只有 c能索引
-
创建(ba)联合索引,b和a都能走索引
-
创建(bc)联合索引,b和c都能走索引
-
创建(bac) 联合索引,b 和 a都能走索引,但比(ba)联合索引多了一个好处,c 字段能索引下推,会减少回表的次数;
-
创建(bca) 联合索引,b和c都能走索引,但比(bc)联合索引多了一个好处,a 字段能索引下推,会减少回表的次数;
(A,B,C) 联合索引 select * from tbn where a=? and b in (?,?) and c>?
会走索引吗?
这个查询会使用到联合索引 (A,B,C)
,因为条件是按照索引列 A
、B
、C
的顺序来的,这是理想的使用场景。
-
对于
A=?
:这个条件是一个精确匹配,MySQL 会使用索引来定位到满足条件A=?
的记录。 -
对于
B IN (?, ?)
:这个条件指定了B
列可以取两个可能的值。MySQL 会利用索引来查找所有匹配A=?
且B
列为这两个值中任意一个的记录。 -
对于
C>?
:这个条件是一个范围查询。在已经根据A
和B
筛选的基础上,MySQL 会继续利用索引来查找C
列值大于指定值的记录。
where a>100 and b=100 and c=123 order by d 怎么建立联合索引?
我觉得建立 bcda 顺序的联合索引比较好,这时候b和c字段都能走索引,而且d能用索引有序性,避免 file sort(额外排序),最后的 a 字段虽然无法走索引(a无序),但是可以利用索引下推, 减少回表的次数。
select id ,name from XX where age > 10 and name like‘xx%’,有联合索引(name,age) ,说一下查询过程
联合索引的顺序是先 name,再age,结构上是先根据 name 排序,name 相等的情况下再根据age 排序。所以优化器需要先匹配 name,name 这时候是右模糊查询,并不会发生索引失效,所以这条sql是能走联合索引的
具体的话,只有 name 能走索引,这是因为由于name右模糊查询后,age 字段的值并不是有序的,因此age 无法走索引,但是age可以进行索引下推。
最后查询的字段是id和name,这两个字段都能在联合索引上查找到,所以不需要回表,是索引覆盖查询。
name右模糊查询属于范围查询,后面字段不能用索引
相关文章:
Mysql-索引应用
目录 索引应用 MySQL有哪些索引? 普通索引和唯一索引有什么区别? 哪个更新性能更好? 、 聚簇索引的主键索引怎么设置? 追问:假如你不设置会怎么样? 我们一般选择什么样的字段来建立索引? 索引越多越好吗? 索引怎么优化? (覆盖索引优化、防止索引失效、…...

Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean
Ocean 是一个独立于平台的框架,支持所有主要操作系统,包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写,包括计算机视觉、几何、媒体处理、网络和渲染&#x…...

【接口自动化_13课_接口自动化总结】
一、自我介绍 二、项目介绍 自己的职责、项目流程 1)功能测试,怎么设计用例的--测试策略 2)功能测试为什么还有代码实现,能用工具实现,为什么还用代码实现。 基本情况 项目名称:项目类型:项目测试人员…...

安防管理平台LntonCVS视频汇聚融合云平台智慧火电厂安全生产管理应用方案
中国的电力产业作为国民经济发展的重要能源支柱,被视为国民经济的基础产业之一。目前,我国主要依赖火力发电,主要燃料包括煤炭、石油和天然气等,通过燃烧转化为动能,再转变为电能输送至全国各地。火力发电量占全国发电…...

【Web性能优化】在Vue项目中使用defer优化白屏,秒加载!
历史小剧场 相对而言,流芳千古的钱谦益先生,就有点儿区别了,除了家产外,也很能挣钱(怎么来的就别说了),经常出没红灯区,六十岁多了,还娶了柳如是,明朝亡时&am…...

springboot上传图片
前端的name的值必须要和后端的MultipartFile 形参名一致 存储本地...

python入门:python及PyCharm安装
前言 我们将详细介绍如何在系统上安装Python及使用PyCharm创建项目的具体流程。Python是一种广泛应用的编程语言,其简单易学的特点使其成为初学者的首选。而PyCharm则是一个功能强大的Python IDE,可以极大地提高开发效率。通过本文,你将学会…...

链接追踪系列-04.linux服务器docker安装elk
[rootVM-24-17-centos ~]# cat /proc/sys/vm/max_map_count 65530 [rootVM-24-17-centos ~]# sysctl -w vm.max_map_count262144 vm.max_map_count 262144 #先创建出相应目录:/opt/dockerV/es/…docker run -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -d -p 92…...
深入探讨微服务架构设计模式与常见实践
深入探讨微服务架构设计模式与常见实践 引言 在现代软件开发中,微服务架构因其灵活性和可扩展性被广泛采用。本文将深入探讨微服务架构的设计理念和常见模式,详细介绍每个模式的实现方法,并分别提供适用于Ubuntu和CentOS的具体命令和代码示…...
【java】合并数组的两种方法
文章目录 1.利用arraycope的方法2.将两数组合并 ,在排序 1.利用arraycope的方法 public class MergeArr {public static void main(String[] args) {int[] arr1 {1,2,3,4,5,6};int[] arr2 {7,8,9};//合并完的数组int[] arr3 new int[arr1.length arr2.length];…...

[图解]分析模式-01-概述1
1 00:00:01,380 --> 00:00:01,770 好 2 00:00:02,340 --> 00:00:06,440 非常感谢大家能够来上我们 3 00:00:06,450 --> 00:00:07,960 分析模式高阶的课程 4 00:00:09,310 --> 00:00:13,440 这个内容之前在分析设计高阶 5 00:00:13,450 --> 00:00:17,840 也就…...

【网络安全】Oracle:SSRF获取元数据
未经许可,不得转载。 文章目录 前言正文漏洞利用 前言 Acme 是一家广受欢迎的播客托管公司,拥有庞大的客户群体。与许多大型运营公司一样,Acme 采用了Apiary的服务,使用户能够安全高效地管理他们的播客。 Apiary 于2017年初被Or…...
Android Bitmap
在Android开发中,位图(Bitmap)是一个非常重要的图形处理对象,它用于在内存中存储图像数据。以下是关于Android中位图使用的一些关键点和方法: 一、获取位图 从资源文件中获取: 使用BitmapFactory类&#…...
2024 年全国青少年信息素养大赛 Python 小学组复赛真题
2024 年全国青少年信息素养大赛 Python 小学组复赛真题 《伶俐角少儿编程》gzh查看所有题目 第一题 题目描述 在一个神秘的王国里,国王希望通过一个简单的测试来评估他的子民对基础数学运算的掌握情况。他决定让每个人输入一个正整数 N (0≤N≤1000),然后计算并输出(5N)的值…...

C语言——流程控制:if...else、switch...case
控制类语句: 逻辑运算符: 选择语句: if...else: if()括号内的内容终究会被转换成0,1,满足的话即为1,不满足的话为0。因此要注意,()括号内因为条件…...

小白的OS Copilot 产品测评
背景 通过群友介绍才知OS Copilot 。不想错过任何优秀的AI产品。随着互联网的发展和时代的进步,要紧跟时代,了解市面上的优秀的AI科技产品。 OS Copilot 产品体验评测 1)您的角色是什么?开发、运维、学生?如果使用O…...
使用Scikit-Learn决策树:分类问题解决方案指南
如何用scikit-learn的决策树分类器解决分类问题 1. 引言 在本教程中,我们将探讨如何使用scikit-learn(sklearn)库中的决策树分类器解决分类问题。决策树是一种强大的机器学习算法,能够根据输入数据的特征属性学习决策规则&#…...
E12.【C语言】练习:求两个数的最大公约数
1.枚举 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {int a 0;int b 0;int tmp 0;scanf("%d %d", &a, &b);if (a < b){for (int i1; i < a; i){if (0a% i && 0b%i)tmp i;}}if (a>b){for (int i 1; i <…...

Elasticsearch:介绍 retrievers - 搜索一切事物
作者:来自 Elastic Jeff Vestal, Jack Conradson 在 8.14 中,Elastic 在 Elasticsearch 中引入了一项名为 “retrievers - 检索器” 的新搜索功能。继续阅读以了解它们的简单性和效率,以及它们如何增强你的搜索操作。 检索器是 Elasticsearc…...

全面升级的对象创建——抽象工厂模式(Python实现和JAVA实现)
1. 引言 大家好!在之前的文章中,我们探讨了简单工厂和工厂方法模式: 轻松创建对象——简单工厂模式(Python实现) 轻松创建对象——简单工厂模式(Java实现) 灵活多变的对象创建——工厂方法模式…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...