0618_MySQL实战45讲_学习笔记_Orderby
表结构
-- auto-generated definitioncreate 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,表示需要排序
步骤(全字段排序)
- MySQL会给每个线程分配一块内存,称为sort_buffer
- 初始化sort_buffer,根据product查找到出满足条件的主键id
- 到id索引取出整行,取出product_no、channel_code、create_date三个字段,存入sort_buffer中
- 重复2 3步骤取出所有满足的数据
- 对sort_buffer中的create_date字段做快速排序
- 按照排序结果把数据返回给客户端
排序
排序这个动作可能会在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数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就会进行优化,具体流程如下:
- 初始化sort_buffer,确定放入product_no和id两个字段
- 索引product_no找到第一个满足product_no = ‘dummy’的条件,取出该主键id
- 通过id索引出整行,取 id和created_date放入sort_buffer中
- 索引produt_no取下一个记录的主键id
- 重复234取出所有满足的条件的记录,并将它们的id和created_date放入sort_buffer中
- 对sort_buffer中的created_date进行排序
- 遍历排序结果,按找id从原表中取出要返回的字段给客户端
总结:当要返回的字段长度大于max_length_for_sort_data时,根据where条件查到满足的记录,然后将排序条件和主键放入sort_buffer中,而不是所有的返回字段
以上是 0618_MySQL实战45讲_学习笔记_Orderby 的全部内容, 来源链接: utcz.com/z/534229.html