order by 字段到底要不要加索引?[大坑]

简介: order by 字段到底要不要加索引?[大坑]

欢迎订阅关注公众号:赵KK日常技术记录

SQL是上午执行的,生产故障是立马就有的!

10:08加的索引,10.20报的错,生产服务卡死
image.png

运维定位SQL,就妥妥定位在我周一申请的sql优化部分,明明就加了个索引,为何导致生产服务直接挂掉?

desc select
  a.No,
  -
  -
  -
  -
  -
  (find_in_set(xx, a.Id))
from
   a
left join  r on
  a.No = r.No
where
  ( a.xxx = 1
  or a.xxx = 1 )
  and a.xx = 3
  and r.xxx is null
  and DATEDIFF(DATE_add(a.xxx,
  interval 0 day ),
  current_date()) >= 0
order by
  a.submitTime desc
limit 0 ,10

生产单表a表450万数据,b表实际450万数据

生产分析

图片

可以看出,我新建的索引已经命中,并且物理扫描行数大大减少,那么为何在生产上查不出数据???

为了紧急修复问题,杀死所有服务后,删除我建的索引再次执行,4S后返回

那么实际执行的扫描行数是9行为什么还如此的慢?

猜测:由于数据量较大,在执行索引操作时,进程正在进行加索引操作,此时刷新造成查询时不走任何索引,导致所有索引失效,或者前期进程有阻塞,造成加索引操作未完成

那么条件是根据用户来查询的,极端情况下理应查出最多数据在几百条,且limit后并不会太多啊?

https://blog.csdn.net/sky_jiangcheng/article/details/79513420

image.png

强制走索引生效吗?本地环境试了是不生效的,而且生产没那么长时间给你去试

本地环境,未加order by索引全表扫描,不走索引

image.png

加了order by 索引,索引命中,物理扫描行数急剧减少

image.png

https://blog.csdn.net/asdasdasd123123123/article/details/106783196/
order by 字段到底要不要加索引?

优化器直接从索引中找到了最小的10条记录,然后回表取得结果集返回。相比上一个执行计划,省去了全表扫描,省去了排序,所以执行时间和系统资源消耗都大大减少。
在这里作一个简单的分析,首先索引和数据不同,是按照有序的排列存储的,当结果集要求按照顺序取得一部分数据时,索引的功效会体现的非常明显,本次查询就是要取得object_id最小的10条记录。其次,建立索引系统只需要消耗一次资源完成排序过程,而如果没有索引,执行不同的语句可能每次都要经历排序的过程,会消耗更多的系统资源。从这个实验看,在order by字段建索引是非常划算的,而且order by字段并不一定非要加入到where条件中也可以生效。

如果这一列存在NULL值,NULL值是没有大小这一说法的,而且不会被保存在索引中。如果优化器无法确定该列没有NULL值,为了保证结果集的准确性,宁愿选择更慢的全表扫描,也不会选择走可能存在NULL的索引,即使用户指定了hint也不会选择

对于order by字段加入索引本身这个问题,如果最终的结果集是以order by字段为条件筛选的,将order by字段加入索引,并放在索引中正确的位置,会有明显的性能提升。

优化有风险,生产需谨慎!

目录
相关文章
|
缓存 前端开发 安全
开发者必读:GET和POST请求的终极对比
大家好,我是小米,今天我们来聊聊HTTP协议中的GET和POST请求。它们在数据传输方式、安全性和应用场景上有不同特点。本文将详细解析它们的区别和特点,帮助你更好地理解和运用这两种请求方式。让我们一起学习吧!
636 4
|
SQL 前端开发 NoSQL
关于幂等:大厂如何解决幂等问题?
为确保分布式系统中接口的幂等性,防止重复下单及更新数据时出现ABA问题,可采取以下措施:首先,每个请求需具备唯一标识符,如订单ID,确保同一订单ID仅能成功处理一次。其次,处理请求后需记录状态标识,如在数据库中记录支付流水。接收请求时检查是否已处理,利用数据库的唯一性约束防止重复操作。例如,支付前插入支付流水记录,若订单ID已存在,则阻止重复支付。此外,为解决ABA问题,可在订单表中增加版本号字段,更新数据时需验证版本号一致性并同步递增版本号,确保数据正确性及更新操作的幂等性。
|
前端开发 Java 数据处理
每日一道面试题之介绍一下Java Bean并谈谈它的命名规范~
每日一道面试题之介绍一下Java Bean并谈谈它的命名规范~
359 0
|
存储 Java
深入理解Java中的堆内存与栈内存分配
深入理解Java中的堆内存与栈内存分配
|
存储 人工智能 算法
探索AI在后端开发中的应用与挑战
随着人工智能技术的飞速发展,AI在后端开发领域扮演着越来越重要的角色。本文将深入探讨AI在后端开发中的应用现状和面临的挑战,分析其带来的影响与发展趋势。
666 1
uView throttle & debounce节流防抖
uView throttle & debounce节流防抖
230 0
|
存储 Arthas 监控
JVM工作原理与实战(三十):堆内存状况的对比分析
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了堆内存状况的对比分析、产生内存溢出的原因等内容。
216 0
|
数据安全/隐私保护 安全
单点登录(SSO)看这一篇就够了
背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于运营人员来说,很不方便。
274767 15
|
SQL 数据库 数据库管理
Sqlite升级时向已有表中增加字段
Sqlite数据库升级时,我们经常会遇到给已有表中增加字段的操作。一般来说,**给已有表中增加字段**是数据库操作中的基操,没必要再专门写篇blog记录的,但是sqlite对SQL语句支持的不够彻底,比方说这次我们用到的"ALTER TABLE"命令。