如何正确地显示随机消息
rowid
对于没有主键,InnoDB会自己生成一个6字节的rowid作为主键。
所以有主键的时候,rowid就是主键。
order by rand()
使用了内存临时表,内存临时表排序的时候用了rowid排序方法。所以不建议使用order by rand(),涉及到内存临时表,sort_buffer。
磁盘临时表
tmp_table_size这个配置限制了内存临时表,默认值是16M。如果临时表大小超过tmp_table_size,那么内存临时表会转成磁盘临时表。
磁盘临时表使用的引擎默认是 InnoDB,是由参数 internal_tmp_disk_storage_engine
控制的。
优先队列排序法
MySQL 5.6 版本引入的一个新的排
序算法,使用limit的时候。
filesort_priority_queue_optimization 这个部分的
chosen=true,就表示使用了优先队列排序算法。
随机选取方法
- 随机取max_id - min_id 之间的一个值,取不小于该值的第一行。
可能id不连续。
- 取总行数,选择某一行Y,再取。
扫描行数增加每次扫Y+1行。