MySQL随机读取表中记录
2020-06-29 本文已影响0人
森林中大鸟
order by rand()来实现
select * from table order by rand();
内存临时表
order by rand() 是一般通过内存临时表排序,可以通过执行计划explain中Extra字段显示Using temporary观察到。
由于是内存排序,回表过程不涉及机械磁盘io操作,速度较快,因此使用的是rowId 排序的方式。
内存临时表使用的是memory引擎,此时的rowId相当于数组下标.
磁盘临时表
tmp_table_size这个配置限制了内存临时表的大小,默认值是16M。如果临时表大
小超过了tmp_table_size,那么内存临时表就会转成磁盘临时表。
磁盘临时表使用的引擎默认是InnoDB,是由参数internal_tmp_disk_storage_engine控制的。
当使用磁盘临时表的时候,对应的就是一个没有显式索引的InnoDB表的排序过程
此时的排序使用归并排序或优先队列排序。
当排序的数据使用limit时,数据量不大时,使用优先队列。数据量大时,仍使用文件的归并排序。
使用随机计算方式
随机id
查询到最大最小id,取之间的随机数,再根据id查询。
快,但不适用于常出现id空洞的数据
随机行之后数据
查询到总行数,根据总行数取随机数,使用limit取随机行数之后的数据。