我的编程空间,编程开发者的网络收藏夹
学习永远不晚

说说explain中的Using filesort

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

说说explain中的Using filesort

有时查看SQL的执行计划时, 会遇到Using filesort, 如下.

mysql> explain select * from tb1 where col1 = 4 order by col2\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: tb1

         type: ref

possible_keys: idx_col1

          key: idx_col1

      key_len: 4

          ref: const

         rows: 1

        Extra: Using where; Using filesort

1 row in set (0.00 sec)


这个filesort是说, MySQL要多做一次额外的排序, 确切的说是快速排序(Quicksort).



先初步了解下Quicksort排序的概念(From Wikipedia). 

Quicksort is a divide and conquer algorithm. Quicksort first divides a large array into two smaller sub-arrays: the low elements and the high elements. Quicksort can then recursively sort the sub-arrays.


The steps are:

1. Pick an element, called a pivot, from the array.

2. Partitioning: reorder the array so that all elements with values less than the pivot come before the pivot, while all elements with values greater than the pivot come after it (equal values can go either way). After this partitioning, the pivot is in its final position. This is called the partition operation.

3. Recursively apply the above steps to the sub-array of elements with smaller values and separately to the sub-array of elements with greater values.


再看下Python对于其的一个实现.

#!/usr/bin/env python

# -*- coding: utf-8 -*-


from __future__ import print_function


def quicksort(array):

    if len(array) < 2:

        return array

    else:

        pivot = array[0]

        less = [i for i in array[1:] if i <= pivot]

        greater = [i for i in array[1:] if i > pivot]


        return quicksort(less) + [pivot] + quicksort(greater)


print(quicksort([10, 5, 2, 3]))



再回来说filesort, 在MySQL中有the Original, Modified和In-Memory filesort Algorithm 3种实现. 


The Original filesort Algorithm

1. 扫描或根据WHERE条件, 获取所有记录.


2. 把每条记录的sort key和row ID, 即<sort_key, rowid>, 放入sort buffer中. 若sort buffer满了, 就在内存中进行一次quicksort, 然后将<sort_key, rowid>写入临时文件, 并记录指向指针. 重复该过程, 直到读取了所有记录.


3. 进行若干次multi-merge操作, 将所有row ID写入结果文件.


4. 根据row ID再次获取记录.


很容易发现, 上面的步骤1和4, 一共读取了2遍记录, 所以也就有了下面的改进实现.


The Modified filesort Algorithm

较Original改变的地方是, 在第2步记录的是sort key和涉及到的其它列, 即<sort_key, additional_fields>, 不是row ID了. 第3步完成后, 就可得到结果了.


这个算法中<sort_key, additional_fields>占用空间比<sort_key, rowid>要大, 若排序数据量很大的情况下, 会频繁写临时文件, 为了避免其, 引入了max_length_for_sort_data参数.


The In-Memory filesort Algorithm

那么排序数据量比较小的情况下呢, 小到在sort buffer中就可完成排序, 针对这种情况又有了In-Memory filesort. 这时MySQL把sort buffer当成priority queue使用, 避免使用临时文件.


上面可以看到MySQL已在尽量优化排序了, 也从侧面说明其不希望排序的出现, 如最开始的SQL, 建立一个(col1, col2)的联合索引, 就可以避免排序了, 该原因还要从B+树索引说起...


若感兴趣可关注订阅号”数据库最佳实践”(DBBestPractice).

说说explain中的Using filesort

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

说说explain中的Using filesort

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

说说我心中的Linux系统

我不知道在阅读此篇文章的你,是一个什么样的人,或许你只是偶然看到此篇文章的路人,或许是对linux有兴趣但没接触过linux的圈外人,或许是已经入行没多久的菜鸟,或许是喜欢linux却学习不下去预备放弃的人更或许你是linux运维技术行业
2023-06-05

说说MySQL中MVCC机制的原理

目录一、概述:二、什么是Undo log三、行的隐藏列四、Undo log版本链五、关于ReadViewReadView包含以下几个重要的参数:一、概述:了解了mysql的底层架构后,我们今天要深入了解下什么是MVCC。MVCC,全称M
2023-04-24

C++中的%的含义说明

很多朋友私信小编不理解C++中的%的含义,其实有两种意思,一种是格式化字符串输出另一种是整数取余,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
2023-03-07

Python经典面试题:说说Python中xrange和range的区别?

昨晚一小伙后台问xrange和range有啥区别,讲了下他倒领悟的挺快,其实这也是你各面试Python岗位,经常会遇到的Python面试题,长个心眼哈,说不定明年3月你找工作就用上了。废话不多说,开始今天的Python面试题目:问:说说Py
2023-06-02

python中的plt.cm.Paired用法说明

plt.cm中cm全称表示colormap paired表示两个两个相近色彩输出,比如浅蓝、深蓝 ;浅红、深红;浅绿,深绿这种。 补充:【python】plt.cm.Spectral,颜色分配 plt.cm.Spectral的简单示例: 实
2022-06-02

python 中sys.getsizeof的用法说明

科班出身的码畜一直被灌输一条上帝圣经:“一个int占4个字节,一个char占1个字节,一个float占4个字节。。。”, 今天看下了python的getsizeof函数,发现python中各个基本数据类型(对象)占用的内存大小和c++/Ja
2022-06-02

Character.UnicodeBlock中cjk的说明详解

本文为大家分享了Character.UnicodeBlock中cjk的说明,供大家参考,具体内容如下Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS : 4E00-9FBF:CJK 统一表意符号 C
2023-05-31

vue3中Vant的使用及说明

这篇文章主要介绍了vue3中Vant的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-16

js中的WebSocket使用及说明

WebSocket是一种实时、低延迟的通信协议,允许客户端与服务器之间双向数据交换,弥补了传统HTTP请求-响应模型的局限性。它具有实时通信、低延迟、双向通信和低开销的优点,广泛用于聊天、实时数据流、多人游戏、物联网和协作工具等应用场景。要使用WebSocket,需要建立连接,收发消息,并使用API管理连接,包括open、send、close、onmessage、onerror等方法和事件。
js中的WebSocket使用及说明
2024-04-02

编程热搜

目录