首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

mysqlorder by是怎样工作

KEY `city` (`city`) ) ENGINE=InnoDB; 通过这个下面这段sql 进行排序: select city,name,age from t where city='杭州' order...by name limit 1000 ; 排序过程: 初始化一个sort buffer 我们对 city进行了索引创建所以通过索引将city为杭州筛选出来;(减少全表扫描) 将筛选出来 city...age name 字段放在内存 sortbuffer (sort buffer 为排序开辟一块新内存) 直到不符合查询条件。...(就算是limit等于1000 在这一步也会查出比1000多数据 在这块分页是不起作用 ) 一直重复第三步 将符合条件在所有数据存入 sort buffer 通过name 进行快速排序。...还有一种就是通过rowId 排序(这种情况是当一行数据过大时候) 直接上 流程图 : ?

2.3K30

Mysql order by 优化

使用索引实现order by 在某些情况下,MySQL可能会使用索引来满足一个ORDER BY子句,并避免执行filesort 操作时涉及额外排序。...在一个联合索引,查询按照索引字段排序,如果排序方式不一致,优化器还是会部分走表扫描。...12 * 在多表关联查询,并且ORDER BY列并不是全部来自第1个用于搜索行非常量表。...这样语句,MySQL会同时会包含"order by col2,col2,..."等同于你显示加速"order by col2,col2,..."排序,这种情况下优化器处理是没有性能损失。...总结 想要写出高效可靠排序查询,你需要搞明白order by大概执行过程,这里可以参考How MySQL executes ORDER BY,Mysql 排序优化与索引使用(转)这两篇文章。

1.4K20

MySQL ORDER BY IF() 条件排序

在做sqlzoo时候,碰到一个SQL排序问题,他把符合条件单独几行,可以放在查询结果开始,或者查询结果尾部 通过方法就是IN语句(也可以通过IF语句) 自己做了个测试,如下,这个是表所有内容...使用ORDER BY配合IF语句 比如我想将species为snake行数,单独列出来,我可以这样查询 SELECT * FROM pet ORDER BY if (species='snake',0,1...那你可以这样写 SELECT * FROM pet ORDER BY if(species='snake',0,1) DESC,species; ?...使用ORDER BY配合IN语句 上面一个是满足单个条件,返回0或者1,那如果需要用到一个范围呢?...你可以使用IN语句 比如下面,我要求把出生日期为1993-02-04或者1989-05-13行数,排在最后 SELECT * FROM pet ORDER BY birth IN('1993-02-04

3.7K50

MySQL——优化ORDER BY语句

MySQL——优化ORDER BY语句 本篇文章我们将了解ORDER BY语句优化,在此之前,你需要对索引有基本了解,不了解老少爷们可以先看一下我之前写过索引相关文章。现在让我们开始吧。...MySQL两种排序方式 1.通过有序索引顺序扫描直接返回有序数据 因为索引结构是B+树,索引数据是按照一定顺序进行排列,所以在排序查询如果能利用索引,就能避免额外排序操作。...ORDER BY优化实战 用于实验customer表索引情况: 首先要注意: MySQL一次查询只能使用一个索引,如果要对多个字段使用索引,建立复合索引。...swj'orderbylast_name,store_id; 画外音:当排序字段不在同一个索引时,无法满足在一颗B+树完成排序,必须再进行一次额外排序 排序字段在一个索引,并且WHERE条件和ORDER...,无法利用索引排序 画外音:这条是针对组合索引而言,我们都知道使用组合索引必要要遵循最左原则,WHERE子句必须有索引第一列,虽然ORDER BY子句没有这个要求,但是也要求排序字段顺序和组合索引列顺序匹配

1.1K21

MySQL ORDER BY(排序) 语句

昨天介绍了 MySQL 数据库 UNION 操作符使用,今天主要讲解下 ORDER BY(排序)语句。 我们知道从 MySQL 表中使用 SELECT 语句来读取数据。...如果需要对读取数据进行排序,我们就可以使用 MySQL ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。...MySQL ORDER BY(排序) 语句可以按照一个或多个列值进行升序(ASC)或降序(DESC)排序。 语法 老规矩,先介绍一下语法。...ORDER BY 子句是一个强大工具,可以根据不同业务需求对查询结果进行排序。在实际应用,注意选择适当列和排序顺序,以获得符合期望排序效果。...以上内容即为 MySQL 数据库使用 ORDER BY 进行排序简单讲解,下期再见。

6910

MySQL Order By工作原理

表t结构见MySQL索引规划。...explain select a, b from t where a > 1000 and a < 10000 order by b desc limit 1000; Extra包含Using filesort...:表示参与排序行数 sort_modepacked_additional_fields:表示排序过程对字符串进行紧凑处理,就是在排序过程按照字符串实际长度来分配空间 rowid排序 上述全字段排序优点是在我们整个过程我们只对原表数据扫描了一遍...MySQL可以通过max_length_for_sort_data参数来进行控制,如果单行长度超过该值,MySQL会认为该行很大,需要切换到rowid算法。...根据索引直接返回 假设我们order by时有索引正好符合我们要求,此时就不需要再借助内存或临时文件进行排序,而是直接利用有序遍历索引树直接返回结果。

76310

Mysql order by排序优化

加大max_length_for_sort_data参数设置 在MySQL,排序算法分为两种,一是只加载排序字段到内存,排序完成后再到表取其他字段,二是加载所有需要字段到内存,显然第二种节省了IO...操作,所以更快 决定使用哪种算法是通过参数max_length_for_sort_data来决定 当所有返回字段最大长度小于这个参数值时,MySQL就会选择第二种算法,反之使用第一种。...所以,如果有充足内存让MySQL存放须要返回非排序字段,就可以加大这个参数值来让MySQL选择第二种排序算法 2....去掉不必要返回字段 当内存不是很充裕时,不能简单地通过强行加大上面的参数来强迫MySQL去使用高效算法,否则可能会造成MySQL不得不将数据分成很多段,然后进行排序,这样可能会得不偿失 此时就须要去掉不必要返回字段...增大sort_buffer_size参数设置 增大sort_buffer_size并不是为了让 MySQL选择第二种排序算法,而是为了让MySQL尽量减少在排序过程对须要排序数据进行分段,因为分段会造成

2.3K50

MySQL ORDER BY 实现原理

4.返回客户端排完序数据。 MySQL 会为每个查询线程分配一块内存,叫做 Sort Buffer,这块内存作用是用来排序。 2.Sort Buffer 空间不够怎么办?...这里 MySQL 根据单行数据长度是否大于 max_length_for_sort_data 参数设置值来判断是否可能会用到文件排序,当行数据长度大于 max_length_for_sort_data...总的来说,MySQL ORDER BY 实现原理是复杂,它依赖于查询优化器决策,可能涉及索引排序、内存排序和磁盘排序等策略。目的是为了在尽可能短时间内返回有序查询结果。...参考文献 Mysql order by实现原理 - 知乎专栏 MySQLorder by语句实现原理以及优化手段 - InfoQ 写作社区 MySQL如何利用索引优化ORDER BY排序语句 -...CSDN 【原创】面试官:谈谈你对mysql联合索引认识?

12010

有趣MySQL(二):“order by”引发乱序

❝人生苦短,不如养狗❞ 一、背景   MySQL可以说是一门比较容易上手但是也很容易出错数据库语言。...一定是今天风有些喧嚣,影响了SQL执行结果......算了,还是老老实实查bug。 二、“order by”引发乱序   经过一番排查,发现罪魁祸首其实是 order by 。...当出现多行相同值时,MySQL会 「自由奔放」 以 「任何顺序」 返回结果集。当然也不会那么奔放,官方也在后面说了,可能会根据执行计划不同最终执行情况也会不同,也就是说最终结果是不稳定。...三、如何解决   既然官方文档也说了,执行结果很大程度受执行计划影响,那么就意味着,在使用 order by我们需要明确查询范围,细化查询条件,让MySQL在执行时更加了解我们需求。...如果哪位大佬有更好解释可以一起交流一下。最后感谢产品经理,让闲鱼在写bug之余也感受到了MySQL“有趣”。

70530

MySQL order by不同排序规则

explain语句执行结果,Extra项中含有Using filesort表示需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。...对sort_buffer数据按order by条件快速排序。 按照排序结果取数据返回。 rowid排序 rowid排序涉及磁盘IO,需要一次回表操作,不受内存大小限制。...当排序字段较多时,内存可放下行数很少,需要分成很多个临时文件,排序性能很差,即MySQL认为排序单行长度太大会使用rowid排序。...到主键id索引取出整行,将查询字段数据放入sort_buffer。 取出下一个记录主键id。 重复步骤3、4直到不满足where条件为止。...对sort_buffer数据按order by条件进行排序。 遍历排序结果,取数据返回。

25340

深入探讨 MySQL order by 优化

翻译一下就是 即使ORDER BY语句不能精确匹配(组合)索引列也能使用索引,只要WHERE条件所有未使用索引部分和所有额外ORDER BY列为常数就行。如何理解这句话呢?...我们基于本例解释"即使ORDER BY语句不能精确匹配(组合)索引列也能使用索引,只要WHERE条件所有未使用索引部分和所有额外ORDER BY列为常数就行。"...分析:order by 字段使用函数,和在where条件中使用函数索引一样 ,MySQL都无法利用到索引。...当查询语句是多表连接,并且ORDER BY列并不是全部来自第1个用于搜索行非常量表.(这是EXPLAIN输出没有使用const联接类型第1个表) ?...但是当where + order 复合要求,order by 有包含了其他表列就会导致额外排序动作。 案例七sql包含order by 列与group by 列不一致 。 ?

1.5K61

Mysql如何使用order by工作

日常开发,我们经常要进行字段排序,但是我们大多不知道排序是如何执行,今天我们就说说order by 执行逻辑, CREATE TABLE `t` ( `id` int(11) NOT NULL...我们发现extra这个子弹Using filesort 表是要进行排序,Mysql为每一个线程分配一块内存用于排序,这个叫sort_buffer. ?...图中nama排序有可能在内存完成,也就可能使用外部排序,这个取决于所需内存和参数sort_buffer_size sort_buffer_size,就是Mysql为排序开辟内存大小,如果排序数据量小于...number_of_tmp_files表示使用临时文件数,我们可以理解为mysql在排序时候把数据分成了12份,每一份单独排序后存在这些临时文件,然后把12有序文件再合并一个有序大文件。..., 看到这里,是不是所有的order by都要进行排序操作,如果不排序就不能获取正确数据呢,其实,并不是多有的order by 语句,都需要排序,MySQL之所以要使用临时文件排序,是因为原来数据都是无序

1K20
领券