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字段加入索引,并放在索引中正确的位置,会有明显的性能提升。

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

目录
相关文章
|
7月前
|
索引
15. 索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
是否越多索引越好?并非如此。应根据需求建索引:主键自动索引,频繁查询、关联查询、排序、查找及统计分组字段建议建索引。但表记录少,频繁增删改操作,频繁更新的字段,以及使用频率不高的查询条件则不需要建索引。
127 0
|
7月前
|
存储 关系型数据库 索引
10. 在一个非主键字段上创建了索引, 想要根据该字段查询到数据, 需要查询几次 ?
在非主键字段上创建索引,查询数据通常需两次。对于MyISAM,先通过索引找到数据行指针,再获取数据;而InnoDB则先找主键ID,再从主键索引中查找数据。
48 0
|
存储 算法 安全
订单号和 id 列可不可以是同一列?
在分布式场景中,单表已经不能满足我们的需求了,所以用自增 id 的方案也就不合适了。当比如我们进行分表设计时,主键列到底如何生成就成了一个问题,流行的方法是利用像 snowflake 这样的算法计算出一个趋势有序的值作为 id。(当然还有其他多种方法)这样就满足了扩展性和一定程度上解决了检索性能的问题。
订单号和 id 列可不可以是同一列?
|
2月前
|
数据库 索引
联合索引和单独列有什么区别
【10月更文挑战第15天】联合索引和单独列有什么区别
125 2
|
4月前
|
SQL 数据挖掘 数据库
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
136 1
|
数据建模 Java 数据库
PowerDesigner使用之为表中字段添加索引
PowerDesigner使用之为表中字段添加索引
411 1
|
SQL
解决union查询order by 排序失效的问题
解决union查询order by 排序失效的问题
241 0
|
SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
74 0
|
存储 数据库 索引
【面试官挖坑】聚集索引会隐式的自动为表添加一个主键索引那你是不是就可以不设置主键索引了?
【面试官挖坑】聚集索引会隐式的自动为表添加一个主键索引那你是不是就可以不设置主键索引了?