MySQL实战笔记:"orderby”是怎么工作的

ADC学习(3)——采样电路 第三章 采样电路 阅读详情

在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。

假设这个表的部分定义是这样的:

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `city` varchar(16) NOT NULL,
  `name` varchar(16) NOT NULL,
  `age` int(11) NOT NULL,
  `addr` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `city` (`city`)
) ENGINE=InnoDB;

这时,你的SQL语句可以这么写:
 

select city,name,age from t where city='杭州' order by name limit 1000  ;

这个语句看上去逻辑很清晰,但是你了解它的执行流程吗?今天,我就和你聊聊这个语句是怎么
执行的,以及有什么参数会影响执行的行为。
全字段排序
前面我们介绍过索引,所以你现在就很清楚了,为避免全表扫描,我们需要在city字段加上索引。
在city字段上创建索引之后,我们用explain命令来看看这个语句的执行情况。使用explain命令查看语句的执行情况:

Extra这个字段中的“Using filesort”表示的就是需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。
为了说明这个SQL查询语句的执行过程,我们先来看一下city这个索引的示意图。

从图中可以看到,满足city='杭州’条件的行,是从ID_X到ID_(X+N)的这些记录。
通常情况下,这个语句执行流程如下所示 :
1. 初始化sort_buffer,确定放入name、city、age这三个字段;
2. 从索引city找到第一个满足city='杭州’条件的主键id,也就是图中的ID_X;
3. 到主键id索引取出整行,取name、city、age三个字段的值,存入sort_buffer中;
4. 从索引city取下一个记录的主键id;
5. 重复步骤3、4直到city的值不满足查询条件为止,对应的主键id也就是图中的ID_Y;
6. 对sort_buffer中的数据按照字段name做快速排序;
7. 按照排序结果取前1000行返回给客户端。

我们暂且把这个排序过程,称为全字段排序,执行流程的示意图如下所示,下一篇文章中我们还会用到这个排序。

图中“按name排序”这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数sort_buffer_size。
sort_buffer_size,就是MySQL为排序开辟的内存(sort_buffer)的大小。如果要排序的数据量小于sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序。
你可以用下面介绍的方法,来确定一个排序语句是否使用了临时文件。

/* 打开optimizer_trace,只对本线程有效 */
SET optimizer_trace='enabled=on'; 
/* @a保存Innodb_rows_read的初始值 */
select VARIABLE_VALUE into @a from  performance_schema.session_status where variable_name = 'I
/* 执行语句 */
select city, name,age from t where city='杭州' order by name limit 1000; 
/* 查看 OPTIMIZER_TRACE 输出 */
SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G
/* @b保存Innodb_rows_read的当前值 */
select VARIABLE_VALUE into @b from performance_schema.session_status where variable_name = 'In
/* 计算Innodb_rows_read差值 */
select @b‑@a;

这个方法是通过查看 OPTIMIZER_TRACE 的结果来确认的,你可以从 number_of_tmp_files中看到是否使用了临时文件。

全排序的OPTIMIZER_TRACE部分结果:

 

number_of_tmp_files表示的是,排序过程中使用的临时文件数。你一定奇怪,为什么需要12个文件?内存放不下时,就需要使用外部排序,外部排序一般使用归并排序算法。可以这么简单理解,MySQL将需要排序的数据分成12份,每一份单独排序后存在这些临时文件中。然后把这12个有序文件再合并成一个有序的大文件。
如果sort_buffer_size超过了需要排序的数据量的大小,number_of_tmp_files就是0,表示排序可以直接在内存中完成。
否则就需要放在临时文件中排序。sort_buffer_size越小,需要分成的份数越多,number_of_tmp_files的值就越大。
接下来,我再和你解释一下图4中其他两个值的意思。
我们的示例表中有4000条满足city='杭州’的记录,所以你可以看到 examined_rows=4000,表示参与排序的行数是4000行。
sort_mode 里面的packed_additional_fields的意思是,排序过程对字符串做了“紧凑”处理。即使name字段的定义是varchar(16),在排序过程中还是要按照实际长度来分配空间的。
同时,最后一个查询语句select @b-@a 的返回结果是4000,表示整个执行过程只扫描了4000行。
这里需要注意的是,为了避免对结论造成干扰,我把internal_tmp_disk_storage_engine设置成MyISAM。否则,select @b-@a的结果会显示为4001。
这是因为查询OPTIMIZER_TRACE这个表时,需要用到临时表,而internal_tmp_disk_storage_engine的默认值是InnoDB。如果使用的是InnoDB引擎的话,把数据从临时表取出来的时候,会让Innodb_rows_read的值加1。

rowid排序
在上面这个算法过程里面,只对原表的数据读了一遍,剩下的操作都是在sort_buffer和临时文件中执行的。但这个算法有一个问题,就是如果查询要返回的字段很多的话,那么sort_buffer里面要放的字段数太多,这样内存里能够同时放下的行数很少,要分成很多个临时文件,排序的性能会很差。
所以如果单行很大,这个方法效率不够好。

那么,如果MySQL认为排序的单行长度太大会怎么做呢?
接下来,我来修改一个参数,让MySQL采用另外一种算法。

SET max_length_for_sort_data = 16;

max_length_for_sort_data,是MySQL中专门控制用于排序的行数据的长度的一个参数。它的意思是,如果单行的长度超过这个值,MySQL就认为单行太大,要换一个算法。

city、name、age 这三个字段的定义总长度是36,我把max_length_for_sort_data设置为16,
我们再来看看计算过程有什么改变。
新的算法放入sort_buffer的字段,只有要排序的列(即name字段)和主键id。

但这时,排序的结果就因为少了city和age字段的值,不能直接返回了,整个执行流程就变成如
下所示的样子:
1. 初始化sort_buffer,确定放入两个字段,即name和id;
2. 从索引city找到第一个满足city='杭州’条件的主键id,也就是图中的ID_X;
3. 到主键id索引取出整行,取name、id这两个字段,存入sort_buffer中;
4. 从索引city取下一个记录的主键id;
5. 重复步骤3、4直到不满足city='杭州’条件为止,也就是图中的ID_Y;
6. 对sort_buffer中的数据按照字段name进行排序;
7. 遍历排序结果,取前1000行,并按照id的值回到原表中取出city、name和age三个字段返回
给客户端。
这个执行流程的示意图如下,我把它称为rowid排序。

对比图3的全字段排序流程图你会发现,rowid排序多访问了一次表t的主键索引,就是步骤7。
需要说明的是,最后的“结果集”是一个逻辑概念,实际上MySQL服务端从排序后的sort_buffer中依次取出id,然后到原表查到city、name和age这三个字段的结果,不需要在服务端再耗费内存存储结果,是直接返回给客户端的。
根据这个说明过程和图示,你可以想一下,这个时候执行select @b-@a,结果会是多少呢?
现在,我们就来看看结果有什么不同。
首先,图中的examined_rows的值还是4000,表示用于排序的数据是4000行。但是select @b-@a这个语句的值变成5000了。
因为这时候除了排序过程外,在排序完成后,还要根据id去原表取值。由于语句是limit 1000,因此会多读1000行。

 rowid排序的OPTIMIZER_TRACE部分输出;

从OPTIMIZER_TRACE的结果中,你还能看到另外两个信息也变了。
   sort_mode变成了<sort_key, rowid>,表示参与排序的只有name和id这两个字段。
   number_of_tmp_files变成10了,是因为这时候参与排序的行数虽然仍然是4000行,但是每
    一行都变小了,因此需要排序的总数据量就变小了,需要的临时文件也相应地变少了。

全字段排序 VS rowid排序
我们来分析一下,从这两个执行流程里,还能得出什么结论。
如果MySQL实在是担心排序内存太小,会影响排序效率,才会采用rowid排序算法,这样排序过程中一次可以排序更多行,但是需要再回到原表去取数据。
如果MySQL认为内存足够大,会优先选择全字段排序,把需要的字段都放到sort_buffer中,这样排序后就会直接从内存里面返回查询结果了,不用再回到原表去取数据。
这也就体现了MySQL的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问。
对于InnoDB表来说,rowid排序会要求回表多造成磁盘读,因此不会被优先选择。
这个结论看上去有点废话的感觉,但是你要记住它,下一篇文章我们就会用到。
看到这里,你就了解了,MySQL做排序是一个成本比较高的操作。那么你会问,是不是所有的
order by都需要排序操作呢?如果不排序就能得到正确的结果,那对系统的消耗会小很多,语句的执行时间也会变得更短。

其实,并不是所有的order by语句,都需要排序操作的。从上面分析的执行过程,我们可以看到,MySQL之所以需要生成临时表,并且在临时表上做排序操作,其原因是原来的数据都是无序的。

你可以设想下,如果能够保证从city这个索引上取出来的行,天然就是按照name递增排序的话,是不是就可以不用再排序了呢?

确实是这样的。

所以,我们可以在这个市民表上创建一个city和name的联合索引,对应的SQL语句是:

alter table t add index city_user(city, name);

作为与city索引的对比,我们来看看这个索引的示意图。

在这个索引里面,我们依然可以用树搜索的方式定位到第一个满足city='杭州’的记录,并且额外确保了,接下来按顺序取“下一条记录”的遍历过程中,只要city的值是杭州,name的值就一定是有序的。
这样整个查询过程的流程就变成了:
1. 从索引(city,name)找到第一个满足city='杭州’条件的主键id;
2. 到主键id索引取出整行,取name、city、age三个字段的值,作为结果集的一部分直接返
回;
3. 从索引(city,name)取下一个记录主键id;

4. 重复步骤2、3,直到查到第1000条记录,或者是不满足city='杭州’条件时循环结束。

引入(city,name)联合索引后,查询语句的执行计划:

可以看到,这个查询过程不需要临时表,也不需要排序。接下来,我们用explain的结果来印证一下。

从图中可以看到,Extra字段中没有Using filesort了,也就是不需要排序了。而且由于(city,name)这个联合索引本身有序,所以这个查询也不用把4000行全都读一遍,只要找到满足
条件的前1000条记录就可以退出了。也就是说,在我们这个例子里,只需要扫描1000次

既然说到这里了,我们再往前讨论,这个语句的执行流程有没有可能进一步简化呢?不知道你还记不记得,我在第5篇文章《 深入浅出索引(下)》中,和你介绍的覆盖索引。这里我们可以再稍微复习一下。覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键索引上去取数据。

 

按照覆盖索引的概念,我们可以再优化一下这个查询语句的执行流程。
针对这个查询,我们可以创建一个city、name和age的联合索引,对应的SQL语句就是:

alter table t add index city_user_age(city, name, age);

这时,对于city字段的值相同的行来说,还是按照name字段的值递增排序的,此时的查询语句也就不再需要排序了。这样整个查询语句的执行流程就变成了:
1. 从索引(city,name,age)找到第一个满足city='杭州’条件的记录,取出其中的city、name和
age这三个字段的值,作为结果集的一部分直接返回;
2. 从索引(city,name,age)取下一个记录,同样取出这三个字段的值,作为结果集的一部分直接
返回;
3. 重复执行步骤2,直到查到第1000条记录,或者是不满足city='杭州’条件时循环结束。

引入(city,name,age)联合索引后,查询语句的执行流程:

然后,我们再来看看explain的结果。

可以看到,Extra字段里面多了“Using index”,表示的就是使用了覆盖索引,性能上会快很多。
当然,这里并不是说要为了每个查询能用上覆盖索引,就要把语句中涉及的字段都建上联合索引,毕竟索引还是有维护代价的。这是一个需要权衡的决定。

小结
今天这篇文章,我和你介绍了MySQL里面order by语句的几种算法流程。
在开发系统的时候,你总是不可避免地会使用到order by语句。你心里要清楚每个语句的排序逻辑是怎么实现的,还要能够分析出在最坏情况下,每个语句的执行对系统资源的消耗,这样才能做到下笔如有神,不犯低级错误。

 

RK3588平台开发系列讲解(SARADC篇)SARADC的工作流程 📢本篇将介绍SARADC的源码分析和工作流程。 阅读详情

相关推荐

Tesseral 建立地震模型

0. 前言 本节内容主要是总结如何使用 Tesseral 工具建立模型。 1. 模型建立步骤 设置模型的宽度和深度 此处默认都为1000,之后点击“确定” 建立地层 绘制新的地层 右键点击“New polygon” 绘制地层,设置第二个层的名字和纵波速度 绘制第三层,第三层覆盖在前一个层上 第四层如上,第四层如果是最后一层,绘制该层时,要将深度1000包围。 设置观测系统 设置炮点 设置子波为雷克子波,频率设置为30 检波点设置 运行模型 设置好如上选择后,

weixin_41857483的博客 6539

MySQL的基本语法(五)

1、order by排序问题 (1)order by 字段名+asc/desc 升序:asc代表从小到大,升序,asc可以省略; 降序:desc代表从大到小,降序,不可省略。 1)升序 2)降序 (2)当一条select语句中同时出现了where条件和order by select * from 表名 where 条件 order by 字段; 2、聚合函数 为了快速得到统计数据,经常会用到如下5个聚合函数:count总记录数;max函数; (备注:聚合函数不能在where后面的条件中使用)

qq_40935604的博客 778

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据 日常工作,我们经常需要汇总相同格式的工作簿的某个工作表的数据 如1月业绩、2月业绩。。。。12月业绩等 姓名 数量 数据22 22 数据23 23 数据24 24 数据25 25 数据26 26 数据27 27 数据28 28 数据29 29 数据30 30 数据31 31 数据32 32 数据33 33 数据34

陈表达的博客 5982

MySQL中的ORDER BY

MySQL中的ORDER BY ​ 当我们使用SELECT语句查询某个数据库的单个列时,如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会收到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖该排序顺序。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。 ​ 为了明确地排序用SELECT语句检索出的数据,可以使用ORDER BY子句。ORDER BY子句

qq_43752126的博客 1万+

OpenClaw 聪明设置指南(真实可用方案)

本文介绍了OpenClaw AI系统的配置与优化指南,主要内容包括:1)基础配置,涵盖初始化流程、安全设置和配置文件位置;2)模型分层策略,推荐主力模型与降级方案;3)性能优化,包括推理加速和内存管理;4)智能提升方法,如人格定义和技能安装;5)高级功能如多Agent协同和Token优化。文章提供了详细的配置命令和参数说明,帮助用户根据需求平衡性能与成本,实现高效AI助手部署。

qq_43344878的博客 709

标签传播算法LPA:半监督学习解决标注数据不足的完整实战指南

在机器学习实际工程中,标注数据稀缺往往是制约模型性能的核心瓶颈。半监督学习提供了一条利用海量未标注数据来增强模型泛化能力的有效路径,其中标签传播算法(Label Propagation Algorithm, LPA)因其直观的图结构和优雅的数学原理而备受关注。LPA通过将样本映射为图中的节点,以相似度作为边权重,让已知标签沿着图结构不断扩散,从而实现对未知样本的预测。其背后基于聚类假设与流形假设,能在低标注率场景下显著缓解过拟合问题,提升分类准确率。该技术在文本分类、金融风控、图像识别等存在大量无标注数据的

weixin_29056781的博客 241

MySQL之ORDER BY 详细解析

1 概述 MySQL有两种方式可以实现ORDER BY: 1.通过索引扫描生成有序的结果 2.使用文件排序(filesort) 围绕着这两种排序方式,我们试着理解一下ORDER BY的执行过程以及回答一些常见的问题(下文仅讨论InnoDB存储引擎)。 2 索引扫描排序和文件排序(filesort)简介 我们知道InnoDB存储引擎以B+树作为索引的底层实现,B+树的叶子节点存储着所有数据页而内部节点不存放数据信息,并且所有叶子节点形成一个**(双向)链表**。 举个例...

firstcode666的博客 3065

【计算机视觉】基于复杂环境下的车牌识别

本文针对复杂环境下(光照变化、车牌变形、噪声干扰)的车牌识别问题,提出了一套完整的优化方案。通过四个核心环节进行改进:1)采用CLAHE、同态滤波等技术优化光照处理;2)使用边缘检测和透视变换应对车牌变形;3)结合中值滤波和暗通道去噪算法消除干扰;4)改进字符分割与识别方法。文章提供了详细的Python实现代码,展示了从预处理到字符识别的完整流程,并通过多策略融合显著提升了复杂场景下的识别准确率。实验结果表明,该方法能有效应对各类复杂环境挑战,为实际应用提供了可靠解决方案。

2401_84149564的博客 1627

MySQL order by关键字详解,order by排序

「作者主页」:士别三日wyx ORDER BY 关键字一、order by 简介1)order by 的作用2)语法格式二、order by 使用1)按照字段名排序2)按照索引进行排序3)降序4)按照多列排序 一、order by 简介 ORDER BY 关键字用于对结果集进行「排序」。 1)order by 的作用 ORDER BY 关键字可以使查询返回的「结果集」按照指定的列进行排序,可以按照某「一列」排序或者同时按照「多列」进行排序,排序的顺序可以是「升序」或者「降序」。 2)语法格式 SELEC.

wangyuxiang946的博客 3万+

深度学习12—VGG19实现

state_dict = load_state_dict_from_url(model_urls['vgg19'],model_dir='./model' ,progress=progress)#预训练模型地址。accuracy=((out.argmax(1)==label).sum()).clone().detach().cpu().numpy()#正确预测的总和比测试集的长度,即预测正确的精度。image=torch.reshape(image,(1,3,224,224))#四维图形,RGB三个通。

m0_55196097的博客 2442

Day880.OrderBy工作原理 -MySQL实战

MySQL 里面 order by 语句的几种算法流程。在开发系统的时候,总是不可避免地会使用到 order by 语句。心里要清楚每个语句的排序逻辑是怎么实现的,还要能够分析出在最坏情况下,每个语句的执行对系统资源的消耗,这样才能做到下笔如有神,不犯低级错误。全字段排序找到满足条件的所有行,取出字段,在内存中对返回字段进行排序,最后返回需要的行数量rowid 排序找到满足条件的所有行,取出对应id和对应排序的字段,在内存中对字段进行排序,返回需要的行数量用id查询出结果覆盖索引排序。

阿昌爱Java 685

YOLOv13改进:注意力机制 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

BiLevelRoutingAttention方法对小目标检测效果比较好。可能是因为BRA模块是基于稀疏采样而不是下采样,一来可以保留细粒度的细节信息,二来同样可以达到节省计算量的目的。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1436

【MySQL】orderby/groupby出现Using filesort根因分析及优化

在日常的数据库运维中,我们可能会遇到一些看似难以理解的现象。比如两个SQL查询语句,仅仅在ORDER BY子句上略有不同,却造成了性能的天壤之别——一个飞速完成,一个则让数据库崩溃。今天就让我们围绕这个问题,深入剖析MySQL的查询优化机制。

小明的Java问道之路 6913

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MySQL45讲 读书笔记 16讲“orderby”是怎么工作的

一 序 本文属于极客时间MySQL45讲读书笔记系列。 还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。 假设这个表的部分定义是这样的: CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` va...

bohu83的博客 355

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

“orderby”是怎么工作的

“orderby”是怎么工作的 假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。 假设这个表的部分定义是这样的: `CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY

YJ语 214

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【读书笔记】MySql实战45讲——orderby的工作原理

class Solution { public int maximumProduct(int[] nums) { Arrays.sort(nums); int nums_len=nums.length; int result = nums[0] * nums[1] * nums[2]; result = Math.max(result, nums[0] * nums[1] * nums[nums_len-1]); res

学海无涯乐作舟 380

mysql-16讲“orderby”是怎么工作的

mysql-16讲“orderby”是怎么工作的 参考 [极客时间mysql核心原理]

weixin_38805083的博客 109

MySQL45讲 【orderby是怎么工作的?】 笔记

Extra 字段中的 Using filesort 表示需要排序. MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。 CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, PRIMARY KEY (`id`), KEY `city` (`city`) ) ENGINE=InnoDB; select city,name from t w

stringKai的博客 214

MySQL中orderBy的工作原理

文章目录1 全字段排序 给定一个表的定义: CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`) ) ENGINE=InnoDB;   如果

如切如磋,如琢如磨 824

mysql orderby 相减_mysql中提高Orderby语句查询效率的两个思路分析

在MySQL数据库中,Order by语句的使用频率是比较高的。但是众所周知,在使用这个语句时,往往会降低数据查询的性能。因为可能需要对数据库的记录进行重新排序。在这篇文章中,笔者就谈谈提高Order By语句查询效率的两个思路,以供大家参考。在MySQL数据库中,Order by语句的使用频率是比较高的。但是众所周知,在使用这个语句时,往往会降低数据查询的性能。因为可能需要对数据库的记录进行重新...

weixin_39692847的博客 338

mysql的orderby是如何工作的

1.建表语句 CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`) ) ENGINE=InnoDB; 2.假设里面插入很多数据,现在需要查询 select city

qq_36115368的博客 220

orderby是如何工作的?

orderby是如何工作的?

热爱永不过时! 379

【4】MySQL学习笔记之OrderBy的工作原理是什么?

在日常的开发 中,我们需要根据指定的字段来排序。 假设定义一个表的语句如下: CREATE TABLE t ( id int(11) NOT NULL, city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL, addr varchar(128) DEFAULT NULL, PRIMARY KEY (id...

Andrew_lee's blog 296

mysql排序显示行数的语句_MySQL中sql语句count(*),orderby,随机数据展示。

count(*)这么慢,我该怎么办?MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;而 InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。这里需要注意的是这是说没有过滤条件的 count(*),如果加了 where 条件的话,MyISAM 表也是不能返回得这么快的。数据很多...

weixin_34312809的博客 726

mysql语句orderby_mysql中的orderby_MySQL

一、order by的原理1、利用索引的有序性获取有序数据当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且索引访问方式为 range,ref 或者 index 的时候,MySQL 可以利用索引顺序而直接取得已经排好序的数据。这种方式的 order BY 基本上可以说是最优的排序方式了,因为 MySQL 不需要进行实际的排序操作,需...

weixin_42134878的博客 787
上一篇: MySQL实战笔记:日志和索引相关问题
下一篇: 指令的积累
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值