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

相关推荐

发表回复

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