20200618_MySQL实战45讲_学习笔记_Order by

20200618_MySQL实战45讲_学习笔记_Order by表结构 — auto-generated definition create table product_application_config ( id bigint auto_increment…

20200618_MySQL实战45讲_学习笔记_Order by

表结构

-- auto-generated definition
create table product_application_config
(
    id                    bigint auto_increment primary key,
    product_no            varchar(32)                            not null,
    channel_code          varchar(32)                            null,
    org_id                bigint                                 not null,
    created_by            varchar(100) default "SYS"             not null,
    created_date          timestamp    default CURRENT_TIMESTAMP not null
);

create index product_application_config_channel_id_index
    on product_application_config (channel_code);


代码100分

查询语句

代码100分explain select product_no,channel_code,created_date from product_application_config where product_no = "dummy" order by created_date

查询Extra字段显示Using filesort,表示需要排序

步骤(全字段排序)

  1. MySQL会给每个线程分配一块内存,称为sort_buffer
  2. 初始化sort_buffer,根据product查找到出满足条件的主键id
  3. 到id索引取出整行,取出product_no、channel_code、create_date三个字段,存入sort_buffer中
  4. 重复2 3步骤取出所有满足的数据
  5. 对sort_buffer中的create_date字段做快速排序
  6. 按照排序结果把数据返回给客户端

排序

排序这个动作可能会在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数sort_buffer_size

  • sort_buffer_size:就是MySQL为排序开辟的内存
    • 如果排序所需内存小于sort_buffer_size,那么排序在内存在完成
    • 如果排序所需内存太大,则不得不利用磁盘临时文件辅助排序(通过查看OPTIMIZER_TRACE的number_of_temp_files参数来确认是否使用了临时文件,大于0就使用了,排序所需内存越大 数字越大,简单理解就是MySQL将需要排序的数据分成了多份,每份单独排序完再组成一个大的有序文件)

如果单行长度过长(rowid排序)

由上面得知,MySQL会把要返回的字段放入sort_buffer_size,那么如果要返回的字段很大,这样内存里能同时存放下的行数很少,要分成多个临时文件,性能很差。

解决方法: 修改max_length_for_sort_data,当要返回的数据长度大于该参数,MySQL就会进行优化,具体流程如下:

  1. 初始化sort_buffer,确定放入product_no和id两个字段
  2. 索引product_no找到第一个满足product_no = ‘dummy’的条件,取出该主键id
  3. 通过id索引出整行,取 id和created_date放入sort_buffer中
  4. 索引produt_no取下一个记录的主键id
  5. 重复234取出所有满足的条件的记录,并将它们的id和created_date放入sort_buffer中
  6. 对sort_buffer中的created_date进行排序
  7. 遍历排序结果,按找id从原表中取出要返回的字段给客户端

总结:当要返回的字段长度大于max_length_for_sort_data时,根据where条件查到满足的记录,然后将排序条件和主键放入sort_buffer中,而不是所有的返回字段

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7807.html

(0)
上一篇 2023-03-13
下一篇 2023-03-13

相关推荐

  • [easou 数据库同步注册]宜搜全站数十万小说爬虫

    [easou 数据库同步注册]宜搜全站数十万小说爬虫自从看了师傅爬了顶点全站之后,我也手痒痒的,也想爬一个比较牛逼的小说网看看,于是选了宜搜这个网站,好了,马上开干,这次用的是mogodb数据库,感觉mysql太麻烦了下图是我选择宜搜里面遍历的网站 …

    2023-02-20
    161
  • 使用numpy.delete删除数组元素

    使用numpy.delete删除数组元素在使用NumPy库进行数据处理时,经常需要对数组进行删除或添加元素的操作。与列表或集合不同,NumPy的数组在删除元素时需要指定要删除的索引位置。本文将介绍如何使用NumPy库中的delete函数删除数组中的元素。

    2024-06-26
    41
  • Python文件命名原则

    Python文件命名原则在Python中,文件命名并没有严格要求,但是为了使代码更为易读易懂,提倡使用一些有规范的文件命名方式。

    2024-04-14
    96
  • 牛客网sql笔试bug_sql语句面试题及答案

    牛客网sql笔试bug_sql语句面试题及答案01 某音短视频 SQL156 各个视频的平均完播率 【描述】用户-视频互动表tb_user_video_log。(uid-用户ID, video_id-视频ID, start_time-开

    2023-05-26
    151
  • 使用rmtree删除文件夹

    使用rmtree删除文件夹在使用Python编写程序时,很多时候需要删除文件夹。Python自带了一个非常方便的模块shutil,其中的rmtree函数可以轻易地删除整个文件夹及其内容。本文将介绍如何使用Python的shutil模块的rmtree函数删除文件夹。

    2024-04-18
    75
  • 基于Python的图片保存技巧

    基于Python的图片保存技巧现在在我们每天的生活学习中,常常需要使用图片来支撑我们的文章和观点。在处理图片时,保存图片是不可避免的。对于Python来说,处理图片和保存图片是一项非常重要的技能。

    2024-09-11
    23
  • Python中多行注释用法

    Python中多行注释用法注释是在程序中起到重要作用的代码标记。在Python中,注释有两种形式:单行注释和多行注释。单行注释主要用“#”号标注,而多行注释使用三引号(”’ ”’)或三个双引号(””” “””)标注。

    2024-07-25
    34
  • mysql综合性练习[通俗易懂]

    mysql综合性练习[通俗易懂]题目描述 设定有一个数据库,里面有4张表: 学生表(student) 课程表(course) 成绩表(score) 教师信息表(teacher) 表结构如下: 表一_学生表(student) 属性名数

    2022-12-18
    144

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注