MySQL排序方案选择
总结
总结一下,MySQL 总是使用 “最快” 的排序方案:
1、当排序数据量不超过 sort buffer
容量时,MySQL 将会在内存使用快速排序算法进行排序(内部排序);当排序数据量超过 sort buffer
容量时,MySQL 将会借助临时磁盘文件使用归并排序算法进行排序(外部排序)
2、在进行真正排序时,MySQL 又会根据数据单行长度是否超过 max_length_for_sort_data
而决定使用 rowid 排序还是全字段排序,优先选择全字段排序,以减少回表次数。并且,如果 SQL 中使用 LIMIT
关键词,LIMIT
行数不大的情况下,会采用优先队列算法进行排序。
3、当需要借助临时表的时候,MySQL 会优先使用内存临时表(此时表引擎为 memory 引擎),回内存临时表取数据并不涉及随机读,也不涉及扫描行,效率较高。所以在配合内存临时表的时候,会使用 rowId 排序方式;当内存临时表大小超过 tmp_table_size
限制时,则需要将内存临时表转换为磁盘临时表,这时候由于回表意味着随机读,所以会搭配全字段排序方式。
参考
- [1] 排序的艺术