今天主要学习了解order by怎么工作
select city,name,age from t_user where city = 'A' order by name limit 100;
一般过程(全字段排序)
- 初始化sort_buffer
- 从索引city找到满足A的主键id
- 去主键索引取整行,取出字段存入sort_buffer
- 重复上述步骤直到索引city不满足条件为止
- sort_buffer 对照name快排
name排序
- 内存大小sort_buffer_size太小,需要磁盘临时文件辅助排序,磁盘排序是归并排序
- 磁盘临时文件数目通过number_of_tmp_files查看
rowid排序
查找过程类似,只通过(name,主键id)排序,最后再去找(city,name,age)
不排序
存在(city,name)的联合索引就不用排序,存在(city,name,age)的联合索引就不用主键回表了
结论
优先用内存,减少磁盘访问
思考题
- 要排序
- 不排序方案:分别取杭州和苏州的前50条记录,感觉还是要排序。。
前次思考题:相同,也是会照样做所有的操作的,该加锁加锁,该更新更新