首页 > 其他分享 >order by是怎么工作的?(总结后超简洁版)

order by是怎么工作的?(总结后超简洁版)

时间:2023-01-14 15:56:21浏览次数:36  
标签:sort 全字段 简洁 后超 内存 rowid MySQL 排序 order

介绍

  排序的动作可能在内存中完成,内存放不下,则利用磁盘临时文件辅助排序。

  Mysql有两种排序算法,全字段排序 和 rowid排序

(1)全字段排序简单的说就是把所有要查询的字段都放在sort_buffer中, 对sort_buffer中的数据进行排序;

(2)rowid排序简单的说是把主键id和需要排序的字段放入sort_buffer中,排完序后,通过回表的方式拿到需要查询的字段。

全字段排序 VS rowid排序

  如果MySQL实在是担心排序内存太小,会影响排序效率,才会采用rowid排序算法,这样排序过

程中一次可以排序更多行,但是需要再回到原表去取数据。

  如果MySQL认为内存足够大,会优先选择全字段排序,把需要的字段都放到sort_buffer中,这

样排序后就会直接从内存里面返回查询结果了,不用再回到原表去取数据。

  这也就体现了MySQL的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问。

对于InnoDB表来说,rowid排序会要求回表多造成磁盘读,因此不会被优先选择。

优化

  并不是所有的order by语句,都需要排序操作的。MySQL之所以需要生成临时表,并且在临时表上做排序操作,其原因是原来的数据都是无序的。如果能够保证取出来的行就是按照你order by后的字段排序好的话,那么就不需要临时表,也不需要排序了。可以通过联合索引或者覆盖索引的方式去优化。

标签:sort,全字段,简洁,后超,内存,rowid,MySQL,排序,order
From: https://www.cnblogs.com/liaowenhui/p/17051952.html

相关文章

  • LeetCode无重复字符的最长子串(unordered_set/kmp滑动窗口)
    原题解unordered_set题目给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。约束解法方法一classSolution{public:intlengthOfLonge......
  • linux 安装简洁的 zsh
    为什么要安装简洁的zshzsh是shell中的佼佼者,但是网上配置zsh的方案,千篇一律的都是配置的oh-my-zsh,个人感觉非常臃肿,配置低的话,用起来还会非常卡。安装zsh本文以......
  • LeetCode刷题(50)~拼写单词【利用数组替换map/unordered_map 提高效率】
    题目描述给你一份『词汇表』(字符串数组)words和一张『字母表』(字符串)chars。假如你可以用chars中的『字母』(字符)拼写出words中的某个『单词』(字符串),那么我们就认......
  • LeetCode两数之和(vector,unordered_map/哈希表)
    原题解vectorunordered_map题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可......
  • 关于 ABAP 的运行时错误 ITAB_ILLEGAL_ORDER
    一个朋友在我的知识星球里提问:Jerry您好!请教一个问题,在生成物料凭证的时候,有个比较奇怪的问题,在函数MARD_MD_ARRAY_READ,第154行的时候会提示运行时错误:ITAB_ILLEG......
  • gcc linking order
    g++-o11.cpp-lpng16#correctg++1.cpp-lpng16-o1#correctg++-lpng161.cpp-o1#wrongg++-o1-lpng161.cpp#wrongLink1 |  Link2 | Link3......
  • [ABC255F] Pre-order and In-order 题解
    [ABC255F]Pre-orderandIn-orderSolution目录[ABC255F]Pre-orderandIn-orderSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给......
  • CF865B Ordering Pizza 题解
    简要题意:有\(n\)个人去披萨店吃披萨,有两种披萨,每个披萨有\(m\)片。现在第\(i\)个人要吃\(c_i\)片披萨,如果吃一片第一种披萨会获得\(a_i\)的幸运值,如果吃一片第二......
  • 让代码变得简洁,总结一二
    1、使用Optional.ofNullable校验入参非空 Optional.ofNullable(user).orElseThrow(()->newDefineException("获取当前登录用户失败。"));2、使用@RequiredArgsCo......
  • 使用嵌套的ScriptableObject及ReorderableList创建习题持久化数据
    使用嵌套的ScriptableObject及ReorderableList创建习题持久化数据效果展示题集持久化数据:存储题目,可以直接在inspector面板上创建对应的问题子项问题持久化数据:源码......