mysql 排序max_length_for_sort_data

mysql有两种文件排序算法(双路排序和单路排序),如果需要排序的列的总大小加上order by列的大小超过了 max_length_for_sort_data定义的字节,mysql就会使用双路排序,当任何需要的列甚至不是用order by的列(text.blob的时候),也会使用双路排序,(可以使用substtring() 把这些列转化为可以单路排序的列)。

可以通过改变 max_length_for_sort_data变量的值来影响mysql选择的算法。因为单路排序为将要排序的每一行创建了固定的缓冲区,varchar列的最大长度是 max_length_for_sort_data规定的值,而不是排序数据的实际大小。

当mysql不得不对text。blob列进行排序时,它只会使用前缀并忽略剩余的值,这是因为不得不分配固定大小的结构来容纳数据并且从外部存储中将前缀拷贝回结构中,可以使用max_sort_length定义前缀应该是多大。

mysql并不会真正的显示使用的是哪种算法,如果增大了max_length_for_sort_data的值,并且磁盘使用率上升,cpu使用率下降,sort_merge_passes的值比以前增加的更快,也许该强制排序使用单路排序算法。


双路排序:
读取行指针和order by列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出。
双路排序的开销可能会非常巨大,因为他会读取表两次,第二次读取会引发大量的随机IO,对于myisam涞说,这个代价尤其昂贵,myisam表利用系统调用去提取每行的数据。

单路排序:
读取查询需要的所有列,按照order by 列对他们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。
MySQL 中,当使用 ORDER BY 或 GROUP BY 语句进行排序时,会在磁盘上创建临时文件进行排序,这个过程称为 filesort。为了优化 filesort 的性能,MySQL 提供了 sort_buffer_size 和 max_length_for_sort_data 两个参数。 sort_buffer_size 参数定义了 MySQL 用于排序的缓冲区大小。默认值为 2MB。如果排序操作需要的内存超过了 sort_buffer_size,MySQL 将使用磁盘上的临时文件进行排序。因此,增大 sort_buffer_size 可以减少磁盘 I/O,提高排序性能。但是,如果 sort_buffer_size 设置过大,会导致内存占用过多,可能会影响其他操作的性能。 innodb_sort_buffer_size 参数用于指定 InnoDB 存储引擎排序时使用的缓冲区大小。该参数默认值为 1MB。与 sort_buffer_size 类似,增大 innodb_sort_buffer_size 可以提高排序性能,减少磁盘 I/O。 为了优化 filesort 的性能,可以按照以下步骤进行调优: 1. 使用 EXPLAIN 命令查看查询执行计划,检查是否使用了 filesort。 2. 如果使用了 filesort,可以尝试增大 sort_buffer_size 和 innodb_sort_buffer_size 参数的值。 3. 如果增大缓冲区大小仍然无法解决问题,可以考虑优化查询语句,减少排序操作。 4. 如果无法通过查询语句优化解决问题,可以考虑增加服务器的物理内存。 需要注意的是,增大缓冲区大小并不是解决所有排序性能问题的万能方法。在实际应用中,需要根据具体情况进行调优。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值