0618_MySQL实战45讲_学习笔记_Orderby

database

表结构

-- 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);

查询语句

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中,而不是所有的返回字段

以上是 0618_MySQL实战45讲_学习笔记_Orderby 的全部内容, 来源链接: utcz.com/z/534229.html

回到顶部