17 如何正确地显示随机消息
内存临时表
对于InnoDB表来说,执行全字段排序会减少磁盘访问,因此会被优先选择
在10000行记录中随机取出3个单词
mysql> select word from words order by rand() limit 3;
执行步骤
1.创建一个临时表,并且没有建立索引
2.在words表中,按主键顺序取出所有的word值,并且调用rand()函数,执行完扫描行数为10000行
3.按照第一个字段排序
4.初始化sort_buffer
5.从临时表取出第一个字段的值和位置信息,分别存入sort_buffer的字段中,这时扫描行数增加10000,变成20000
6.在sort_buffer中根据第一个字段的值排序
7.排序完成后,取出前三个结果的位置信息。因此扫描行数变为20003.
POS就是位置信息。
Order by rand()使用了内存临时表,内存临时表排序的时候使用了rowid排序方法
磁盘临时表
tmp_table_size这个配置限制了内存临时表的大小,默认为16M,如果超过了tmp_table_size,那么内存临时表就会转成磁盘临时表。
当使用磁盘临时表的时候,对应的就是一个没有显示索引的InnoDB表的排序过程
Mysql5.6版本引入了新的排序算法,优先队列排序算法
避免使用Order by rand()