MySQL 之 order by 排序
2021-12-09 17:54:30 0 举报
MySQL order by 排序流程
作者其他创作
大纲/内容
ID
Rowid 排序
调用rand()函数,生成大于0小于1的随机小数,存入R
name无序
内存临时表
结果集
name有序
内存中回表
初始化
city
name
age
sort_buffer
city索引
按name快速排序
表T主键索引
如果内存够,就要多利用内存,尽量减少磁盘访问。(全字段排序 > Rowid 排序)
无序数据 (全字段排序 vs Rowid 排序)
取值
word
创建引擎为memory 的临时表
R
覆盖索引
tmp_table_size 这个配置限制了内存临时表的大小,默认值是 16M。如果临 时表大小超过了 tmp_table_size,那么内存临时表就会转成磁盘临时表。
查询
联合索引
初始化sort_buffer
“按 name 排序”这个动作,可能在内存中完成,也可能需要使用外部排序,这取决 于排序所需的内存和参数 sort_buffer_size。sort_buffer_size,就是 MySQL 为排序开辟的内存(sort_buffer)的大小。如果要排序的 数据量小于 sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不 下,则不得不利用磁盘临时文件辅助排序。
返回
根据 R 值排序
随机 order by rand()
表结构
...
pos
如果T表也在内存中,不需要频繁磁盘访问,则会选择字段最小。(全字段排序 < Rowid 排序)
有序数据
回表
全字段排序
表结构 与数据填充
city杭州
select word from words order by rand() limit 3;
R: double 类型的字段 pos:6 字节的 rowid 整型 每个引擎用来唯一标识 数据行的信息。(没有主键时,innodb 会自动生成 rowid)
原表
0 条评论
回复 删除
下一页