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取随机行数之后的数据。

上一篇下一篇

猜你喜欢

热点阅读