iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >说说explain中的Using filesort
  • 776
分享到

说说explain中的Using filesort

2024-04-02 19:04:59 776人浏览 独家记忆
摘要

有时查看sql的执行计划时, 会遇到Using filesort, 如下.Mysql> explain select * from tb1 where col1 = 4 order

有时查看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

您可能感兴趣的文档:

--结束END--

本文标题: 说说explain中的Using filesort

本文链接: https://www.lsjlt.com/news/43317.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MySQL 5.7 EXPLAIN EXTENDED语句说明
    EXPLAIN EXTENDED相比EXPLAIN命令,会额外显示一个filtered字段。这个字段会指示出表的条件所过滤的表中行数的百分比。除此之外,在执行EXPLAIN EXTENDED命令之后,使用S...
    99+
    2024-04-02
  • 说说我心中的Linux系统
     我不知道在阅读此篇文章的你,是一个什么样的人,或许你只是偶然看到此篇文章的路人,或许是对linux有兴趣但没接触过linux的圈外人,或许是已经入行没多久的菜鸟,或许是喜欢linux却学习不下去预备放弃的人更或许你是linux运...
    99+
    2023-06-05
  • 说说MySQL中MVCC机制的原理
    目录一、概述:二、什么是Undo log三、行的隐藏列四、Undo log版本链五、关于ReadViewReadView包含以下几个重要的参数:一、概述: 了解了mysql的底层架构后,我们今天要深入了解下什么是MVCC...
    99+
    2023-04-24
    MySQL MVCC机制实现 MySQL的MVCC机制
  • 说说 TCP的粘包、拆包
    分析&回答 拆包和粘包是在socket编程中经常出现的情况, 在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。如果通讯的一端发送的数据包超过一次tcp...
    99+
    2023-09-05
    tcp/ip 网络 网络协议
  • 简单说说STL的内存管理
    1. 概述STL Allocator是STL的内存管理器,也是最低调的部分之一,你可能使用了3年stl,但却不知其为何物。 STL标准如下介绍Allocatorthe STL inc...
    99+
    2022-11-15
    STL 内存管理
  • 简单说说Python与Go的区别
    背景 工作中的主力语言是Python,今年要搞性能测试的工具,由于GIL锁的原因,Python的性能实在是惨淡,需要学一门性能高的语言来生成性能测试的压力端。因此我把目光放在了现在的新秀Go。经过一段时间的学习,也写了一个小工具,...
    99+
    2023-01-31
    区别 简单 Python
  • 说说@ModelAttribute在父类和子类中的执行顺序
    @ModelAttribute在父类、子类的执行顺序 被 @ModelAttribute 注解的方法会在Controller每个方法执行之前都执行,因此对于一个Controller中...
    99+
    2024-04-02
  • 说说我当初是如何学Linux的
    今天我就说说我当初是如何从一名普通桌面维护工程师,通过学习和努力转成Linux运维工程师的,以及作为Linux运维工程师需要一些什么技能和知识,希望可以帮到一些对Linux有兴趣或者想往Linux这个方向转的,都可以看看。15年我还在做普通...
    99+
    2023-06-05
  • 说说Node.js自带的模块热替换
    Node.js是一个非常流行的JavaScript运行环境,它使得开发者可以使用JavaScript构建高性能的网络应用。在Node.js的生态系统中,许多开发者喜欢使用实时重载工具来提高开发效率。而热模块替换就是一种实时重载工具,它可以在...
    99+
    2023-05-14
  • Python经典面试题:说说Python中xrange和range的区别?
    昨晚一小伙后台问xrange和range有啥区别,讲了下他倒领悟的挺快,其实这也是你各面试Python岗位,经常会遇到的Python面试题,长个心眼哈,说不定明年3月你找工作就用上了。废话不多说,开始今天的Python面试题目:问:说说Py...
    99+
    2023-06-02
  • 面试官常问之说说js中var、let、const的区别
    前言 关于 var、let 和 const 三个关键字的区别,是一个老生常谈的问题,也是经典的面试题。本篇文章将全面讲解三者的特性,以及它们之间的区别,由浅入深让你彻底搞懂这个知识点...
    99+
    2024-04-02
  • mysql中的变量说明
    这篇文章主要介绍“mysql中的变量说明”,在日常操作中,相信很多人在mysql中的变量说明问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql中的变量说明”的疑惑有所帮...
    99+
    2024-04-02
  • C++中的%的含义说明
    目录C++中的%的解释补充:c++中&什么意思C++中的%的解释 两种意思:1、格式化字符串输出2、整数取余 1、目前printf支持以下格式的输出,例如:printf(&q...
    99+
    2023-03-07
    C++中 % 的含义 C++中 %是什么
  • explain都不会用,你还好意思说精通MySQL查询优化?
    这篇文章主要讲解了“explain都不会用,你还好意思说精通MySQL查询优化?”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“explain都不会用,你还好...
    99+
    2024-04-02
  • 说说为什么CSS不能选中某些元素
    CSS 不能选中CSS 是一种用于制作网站设计的语言,它可以让我们对网页进行样式控制和布局管理。在这个过程中,有很多关键性的功能可以让我们自由地掌握网页设计,其中包括选择网页元素。然而,有时我们需要控制一些不能被选中的元素。那么为什么 CS...
    99+
    2023-05-14
  • 说说html转pdf工具的使用范围
    随着互联网应用的不断普及,越来越多的文件需要在线阅读和分享。但有时候,在线阅读并不能满足用户的需求。比如,用户需要离线保存或打印某个网页或文档。这时,将网页或文档转换为PDF格式就是一种不错的选择。因此,一些网站和开发者也开发出了html转...
    99+
    2023-05-14
  • 简单说说JVM堆区的相关知识
    一、堆概述 一个jvm实例(进程)只存在一个堆内存,堆也是java内存管理的核心区域。 java 堆区在jvm启动时即被创建,其空间大小也就被确定了 《ja...
    99+
    2024-04-02
  • 说说Java异步调用的几种方式
    目录一、通过创建新线程二、通过线程池三、通过@Async注解四、通过CompletableFuture日常开发中,会经常遇到说,前台调服务,然后触发一个比较耗时的异步服务,且不用等异...
    99+
    2024-04-02
  • Python中sub()的用法说明
    Python来进行查询和替换一个文本字符串? 可以使用sub()方法来进行查询和替换,sub方法的格式为: sub(replacement, string[, count=0])...
    99+
    2024-04-02
  • Web中Jsp说什么
    这篇文章主要为大家展示了“Web中Jsp说什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Web中Jsp说什么”这篇文章吧。 Web基础了解版-Jsp J...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作