mysql优化之索引扫描排序

【转】MySQL松散索引扫描与紧凑索引扫描 在优化group by查询的时候,一般的会想到两个名词:松散索引扫描(Loose Index Scan)和紧凑索引扫描(Tight Index Scan),因为通过这两种索引扫描就可以高效快速弟完成group by操作。 group by操作在没有合适的索引可用的时候,通常先扫描整个表提取数据并创建一个临时表,然后按照group by指定的列进行排序。在这... 阅读详情

前言:

mysql有两种方式可以生成有序的结果:通过排序操作或者按索引顺序扫描,如果explain出来的type列的值为index,则说明mysql使用了索引扫描来做排序。

扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录。但如果索引不能覆盖查询所需的全部列,那么就不得不每扫描一条索引记录就得回表查询一次对应的行,这基本都是随机IO,因此按索引顺序读取数据的速度通常要比顺序地全表扫描慢。

mysql可以使用同一个索引即满足排序,又用于查找行,如果可能的话,设计索引时应该尽可能地同时满足这两种任务。

只有当索引的列顺序和order by子句的顺序完全一致,并且所有列的排序方式都一样时,mysql才能够使用索引来对结果进行排序,如果查询需要关联多张表,则只有当order by子句引用的字段全部为第一张表时,才能使用索引做排序。order by子句和查找型查询的限制是一样的,需要满足索引的最左前缀的要求,否则,mysql都需要执行顺序操作,而无法利用索引排序。

# 使用索引扫描来做排序

​        mysql有两种方式可以生成有序的结果:通过排序操作或者按索引顺序扫描,如果explain出来的type列的值为index,则说明mysql使用了索引扫描来做排序

​        扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录。但如果索引不能覆盖查询所需的全部列,那么就不得不每扫描一条索引记录就得回表查询一次对应的行,这基本都是随机IO,因此按索引顺序读取数据的速度通常要比顺序地全表扫描慢

​        mysql可以使用同一个索引即满足排序,又用于查找行,如果可能的话,设计索引时应该尽可能地同时满足这两种任务。

​        只有当索引的列顺序和order by子句的顺序完全一致,并且所有列的排序方式都一样时,mysql才能够使用索引来对结果进行排序,如果查询需要关联多张表,则只有当orderby子句引用的字段全部为第一张表时,才能使用索引做排序。order by子句和查找型查询的限制是一样的,需要满足索引的最左前缀的要求,否则,mysql都需要执行顺序操作,而无法利用索引排序

sql--注意,这是MySQL5.7执行的结果,mysql8执行有些地方会不同,理解下意思就行,数据库是mysql官网上的sakila
sakila数据库中rental表在rental_date,inventory_id,customer_id上有rental_date的索引(rental_date为组合索引,包括rental_date,inventory_id,customer_id)
1、使用rental_date索引为下面的查询做排序

explain select rental_id,staff_id from rental where rental_date='2005-05-25' order by inventory_id,customer_id\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: rental
   partitions: NULL
         type: ref
possible_keys: rental_date
          key: rental_date
      key_len: 5
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using index condition
1 row in set, 1 warning (0.00 sec)

order by子句不满足索引的最左前缀的要求,也可以用于查询排序,这是因为所以你的第一列(rental_date='2005-05-25')被指定为一个常数

2、该查询为索引的第一列提供了常量条件,而使用第二列进行排序,将两个列组合在一起,就形成了索引的最左前缀

explain select rental_id,staff_id from rental where rental_date='2005-05-25' order by inventory_id desc\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: rental
   partitions: NULL
         type: ref
possible_keys: rental_date
          key: rental_date
      key_len: 5
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

3、下面的查询不会利用索引(第一列使用了范围查找)

explain select rental_id,staff_id from rental where rental_date>'2005-05-25' order by rental_date,inventory_id\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: rental
   partitions: NULL
         type: ALL
possible_keys: rental_date
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 16005
     filtered: 50.00
        Extra: Using where; Using filesort

4、该查询使用了两中不同的排序方向,但是索引列都是正序排序的

explain select rental_id,staff_id from rental where rental_date>'2005-05-25' order by inventory_id desc,customer_id asc\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: rental
   partitions: NULL
         type: ALL
possible_keys: rental_date
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 16005
     filtered: 50.00
        Extra: Using where; Using filesort
1 row in set, 1 warning (0.00 sec)

5、该查询中引用了一个不再索引中的列

explain select rental_id,staff_id from rental where rental_date>'2005-05-25' order by inventory_id,staff_id\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: rental
   partitions: NULL
         type: ALL
possible_keys: rental_date
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 16005
     filtered: 50.00
        Extra: Using where; Using filesort
1 row in set, 1 warning (0.00 sec)

```

 

 

 

 

MySQL之索引优化进阶:排序与压缩索引的深度解析 大家好!在技术学习的道路上,我一直希望能和各位携手共进,一起探索MySQL数据库的优化技巧。今天,咱们深入探讨MySQL索引优化中两个重要的知识点——使用索引扫描来做排序以及压缩索引,希望通过这篇文章,能帮助大家更好地理解和运用这些知识,进一步提升MySQL数据库的性能 阅读详情

相关推荐

INDEX FAST FULL SCAN和INDEX FULL SCAN

INDEX FULL SCAN 索引全扫描。单块读 。它扫描的结果是有序的,因为索引是有序的。它通常发生在 下面几种情况(注意:即使SQL满足以下情况 不一定会走索引全扫描) 1. SQL语句有order by选项,并且orde

zhaoyangjian724的专栏 955

mysql使用索引扫描进行排序

mysql有两种方式可以生成有序的结果:通过排序操作或者按索引顺序扫描,如果explain出来的type列的值为index,则说明mysql使用了索引扫描来做排序 ​ 扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录。但如果索引不能覆盖查询所需的全部列,那么就不得不每扫描一条索引记录就得回表查询一次对应的行,这基本都是随机IO,因此按索引顺序读取数据的速度通常要比顺序地全表扫描慢 ​ mysql可以使用同一个索引即满足排序,又用于查找行,如果可能的话,设计索引时应该尽可能地同时满足

qq_40172704的博客 329

CH455G数码管驱动与键盘扫描:I2C通信协议深度解析与实战代码

本文深度解析CH455G芯片的I2C通信协议,涵盖数码管驱动与键盘扫描功能的实战应用。通过详细讲解起始/停止信号、数据帧结构、应答机制及单片机代码实现,帮助开发者高效利用该芯片减少IO占用,提升嵌入式系统设计效率。

tea88的博客 1085

mysql使用索引扫描做排序,MySQL-使用索引扫描来做排序

MySQL有两种方式可以生成有序的结果:通过排序操作;或者按索引顺序扫描;如果EXPLAIN出来的type列的值为:“index“,则说明MySQL使用了索引扫描来做排序扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录。但如果索引不能够覆盖查询所需的所有列,那就不得不每扫描一条索引记录就会表查询一次对应的行。这基本是上随机I/O,因此按索引顺序读取数据的速度通常要比顺序地全表...

weixin_27758233的博客 306

贴片二极管SOD封装详解:SOD-123/323/523尺寸焊盘设计要点

表面贴装技术中,二极管封装尺寸直接决定PCB布局与焊接可靠性。SOD封装作为小外形二极管的主流形态,其SOD-123、SOD-323、SOD-523三种规格分别对应不同的功耗与占板面积权衡。理解封装尺寸、焊盘设计计算逻辑和钢网开窗原理,是避免立碑、虚焊等工艺缺陷的关键。在可穿戴设备、电源保护等空间受限场景中,合理选择封装不仅能优化散热路径,还能提升量产良率。本文从焊盘计算、工艺要点到选型策略,全面解析SOD封装的工程实践。

weixin_42520780的博客 307

从Protocol到硬件控制:揭秘高通UEFI中ABL与XBL的协作机制

本文深入解析了高通UEFI架构中ABL与XBL的协作机制,重点探讨了Protocol通信在硬件控制中的关键作用。通过对比传统GPIO控制方式,揭示了Protocol架构在安全性、可维护性和灵活性方面的优势,并提供了关机充电场景的实战案例分析及调试技巧。

weixin_29185199的博客 431

mysql索引优化2

之前写过一篇索引的总结,但是发现有些东西还是没有涉及到又或是不够详细,这次再继续写 索引type 使用explan 解释sql语句时,会有一列type,这个type标志了该索引的级别,EXPLAIN执行计划中type字段分为以下几种:ALL ,INDEX ,RANGE ,REF ,EQ_REF CONST, SYSTEM NULL,性能从最差到最好 上面各类扫描方式由快到慢: system > const > eq_ref > ref >

qq_22162093的博客 493

倍福EL5101模块连接编码器

1、 EL5101模块简介:EL5101为单通道增量型编码器计数模块,一共有EL5101-0000、EL5101-0010、EL5101-0011、EL5101-0090(尚未供货)四种型号,其中EL5101-0000比较常用,本例使用EL5101-0000连接增量型编码器 2、 硬件外观和接线 在这里插入图片描述 3、 指示灯说明 4、和编码器连接的案例 ......

weixin_41883890的博客 6501

【看过来全网最细节】MySQL大数据量处理:全面优化方案与实践

【深度解析】MySQL大数据量表优化策略与实施指南

风信子的博客 3220

yolov5改进之Fasternet主干网络替换

fasternet替换yolov5主干网络

qq_41920323的博客 5144

金融领域强化学习在高频交易中的应用

强化学习(Reinforcement Learning,简称RL)是一种机器学习范式,通过智能体与环境的交互来学习策略,以最大化累计奖励。与监督学习和无监督学习不同,强化学习依赖于动态的反馈机制,智能体通过试错不断优化决策过程。高频交易(High-Frequency Trading,简称HFT)是指在极短时间内进行的大量金融交易,通常利用算法和计算机系统自动执行交易策略。高频交易依赖于高速的数据处理和决策能力,以捕捉市场中的微小价格波动。状态(State):环境在某一时刻的观测,反映了系统的当前情况。

AI天才研究院 893

MySQL-索引优化篇(2)_使用索引扫描来优化排序

文章目录官方文档 官方文档 https://dev.mysql.com/doc/ 如果英文不好的话,可以参考 searchdoc 翻译的中文版本 http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html ...

小工匠 2万+

提示工程ROI计算模板:架构师私藏Excel表(含自动计算)

花3个人力优化提示词,到底能带来多少实际收益?“这个提示工程项目值得做吗?投入10万成本,多久能回本?“不同LLM应用的提示词优化优先级怎么排?全凭经验拍脑袋?当前90%的企业在提示工程投入上缺乏标准化的量化评估方法,导致资源浪费(盲目投入无回报项目)或错失机会(低估高价值优化点)。ROI = (总收益 - 总成本) / 总成本 × 100%对于提示工程,总成本=显性成本+隐性成本,总收益=直接收益+间接收益(后文会详细拆解)。提示工程的价值不是“玄学”,而是可以用数据量化的投资行为。本文分享的。

AI开发架构师 1075

mysql优化-使用索引扫描来做排序

mysql可以使用同一个索引既满足排序,又用于查询行。如果可能,设计索引时,应该尽可能的同时满足这两种任务是最好的。 一、什么时候可以用索引扫描进行排序 只要当索引列的顺序和order by字句的顺序完全一致 ,并且所有列的排序方向(倒叙或正序)都一样时。才能用索引扫描进行排序。 如果查询需要关联多张表,则只有当order by字句应用的字段全部为第一张表时,才能使用索引排序。而且order by...

weixin_40980639的博客 375

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

使用索引扫描来做排序-mysql索引优化

使用索引扫描来做排序 ​ mysql有两种方式可以生成有序的结果:通过排序操作或者按索引顺序扫描,如果explain出来的type列的值为index,则说明mysql使用了索引扫描来做排序 ​ 扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录。但如果索引不能覆盖查询所需的全部列,那么就不得不每扫描一条索引记录就得回表查询一次对应的行,这基本都是随机IO,因此按索引顺序读取数据的速度通常要比顺序地全表扫描慢 ​ mysql可以使用同一个索引即满足排序,又用于查找行,如果可能的话,设

m0_48333563的博客 248

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MySQL(一):详解使用索引扫描来做排序

一、MySQL生成有序结果的方式 1)直接通过排序操作 2)按索引顺序扫描 如果explain执行计划的type列值为index,这说明mysql使用了索引扫描来做排序。 二、索引扫描的特点 扫描索引本身是很快的,因为只需要顺序从一条索引记录移动到紧接着的下一条记录。但如果索引不能覆盖查询所需的全部列,那么每扫描到一条索引记录就得进行随机IO回表查询一次对应的行;因此在这种情况下,按索引顺序读取数据的速度通常要比顺序地全表扫描慢,因为顺序IO速度远快于随机IO。 1. 多表查询时 只有当索引的列顺序和ord

健身变秃,coding变强 1024

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

高性能mysql索引的顺序_Schema的优化和索引 - 高性能的索引策略 - 使用索引扫描来进行排序...

MySQL有两种方法生成有序的结果:使用文件排序或者按顺序的扫描索引。你可以使用EXPLAIN来查看type列是否是index来得知MySQL是否计划的扫描索引。扫描索引本身是非常快速的,因为它只是简单的需要从一个索引实体移动到下一个。然而,如果MySQL没有使用索引覆盖这个查询,它就会查找在索引中发现的每一行。这是个随机IO的过程,因此从索引顺序中读取数据比连续表的扫描要慢很多。MySQL可以使...

weixin_29522501的博客 238

MySQL 排序的那些事儿

如果涉及排序,可以把sort_buffer_size设置大点如果使用Tmpfs就把MySQL物理内存配置的大点如果使用xfs/ext4就用高速SSD硬盘。

fofcn的专栏 1841

MySQL查询优化:GROUP BY

目录 一、group by group by 优化方法 — 索引 松散索引扫描(Loose Index Scan) 为什么松散索引扫描的效率会很高? 紧凑索引扫描(Tight Index Scan) group by 优化方法 — 直接排序 二、group by 与 distinct 三、排序不一致问题 一、group by 当我们执行 group by 操作在没有合适的索引可...

resemble的博客 2万+

mysql的索引扫描排序与全表排序

mysql的索引扫描排序与排序操作 目录 一、排序方式 二、判断 三、规则 四、举例 一、排序方式 mysql有两种方式可以生产有序的结果: 1、通过排序操作; 2、按索引顺序扫描; 二、判断 通过explain出来的type列的值为“index”,则说明mysql使用了索引扫描来做排序。 扫描索引本身是很快的,因为只需要从一条索引...

stay hungry ! stay foolish! 1074

深入解析 MySQL 5.7 多字段排序问题及 MySQL 8.0 降序索引优化

MySQL 5.7在多字段降序排序时存在性能瓶颈,因其索引仅支持升序存储,导致混合排序方向会触发低效的filesort。MySQL 8.0引入降序索引后,通过显式指定字段排序方向(如CREATE INDEX idx_a_desc ON t(a DESC)),可显著优化多字段排序性能。实验表明,索引与查询的排序方向完全匹配时,8.0版本能避免filesort,提升千万级数据查询效率。优化策略包括:按查询模式设计索引、统一排序方向、使用覆盖索引,5.7版本可考虑应用层排序或冗余表方案。

qq_46371374的博客 1137

如何写一个高效的索引,优化mysql查询(分页,回表,排序)

1. 需要优化的地方 where用索引(避免全表扫描) select用索引(避免回表) 排序走索引 (避免查询出来后还要进行排序) 按照[《数据库索引设计与优化》][1]的说法满足1,2和3的索引就是三星索引了 2. 例子 测试表有3308670行数据,数据是我网上找了个人名生成网站后把数据写进去的 CREATE TABLE `eyas_account` ( `id` int(11) NO...

wzhzzzz的博客 1486

MySQL 是如何实现数据的排序的?

上面2种回答方式:第一种,更偏向余点对点的回答,类似我们读书时候的回答试卷的方式;第二种,更偏向于把理论之前与实际开发结合回答,并且更注重得出结论的思考过程;如果你是面试官,你会觉得那种回答更能得到你的青睐呢?欢迎在评论区给出你的观点!李东平|一线码农引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构。

sdgfafg_25的博客 1191

MySQL 索引优化实战:从执行计划分析到优化策略落地

在 MySQL 数据库的日常运维和开发中,查询性能是绕不开的关键话题。当系统面临慢查询问题时,索引优化往往是提升性能的重要手段。而要做好索引优化,首先必须学会解读执行计划,它就像查询的 “X 光片”,能清晰展现查询的执行路径和潜在问题。本文将从执行计划的解读入手,梳理索引优化的方向,并通过实际慢查询案例,完整演示优化过程与前后效果对比。

Java是世界上最好的语言 1289

mysql在扫描情况下会选择全表扫描而不是走索引

1.有一张表t_account CREATE TABLE `t_account` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT '', `age` int DEFAULT '0', `phone` varchar(20) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, `goods` int DEFAULT '0', `update_time` d

乐乐的博客 4376
上一篇: mysql优化技巧
下一篇: mysql优化之索引监控Handler_read
zy_crazy_code
博客等级 码龄12年 290粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值