mysql 随机获取几条记录 学习笔记

如何从表里随机的取三个值?
1、selelct word from words order by rand() limit 3
但是 使用explain命令看执行情况会发现有using temporary using filesort
说明使用了临时表和排序
 
之前了解到排序mysql的内部算法分全字段排序和rowid排序,基于之前学习的结论,对于InnoDB表来说,执行全字段排序会减少磁盘访问,因此会被优先选择。强调INnodb表,对于内存表,回表过程只是简单的根据数据行的位置,直接访问内存得到数据,根本不会导致多访问磁盘,优化器没有了这一层的考虑,那么它会优先考虑的,就是用户排序的行越少越好了,所以mysql会选择rowid排序
 
mysql表使用什么方法来定位一行数据的?如果把一个innodb表的主键删掉,是不是就没有主键了,就没办法回表了?
 
其实不是,如果没有创建表没有主键,或者把一个表的主键删除了,那么Innodb会自己生成一个长度为6字节的rowid来作为主键,用来唯一标识数据行的信息
 
对于有主键的Innodb表来说,这个rowid就是主键ID
对于没有主键的Innodb表来说,这个rowid就是由系统生成的
memory引擎不是索引组织表,
 
总结:order by rand()使用了内存临时表,内存临时表排序的时候使用了rowid的排序方法
 
其实所有的临时表都不全是内存表,主要取决于tmp_table_size这个配置限制,默认是16M,如果临时表大小超过了tmp_table_size那么内存临时表就会转成磁盘临时表
 
不管使用哪种类型的临时表,order by rand 这种写法都会让计算过程非常复杂,需要大量的扫描行数,因此排序过程的资源消耗也非常大
 
如果按照我的解决方式 就是
按照业务需求,随机取三个,数据库还在设计阶段,可以增加一个主键字段,用来记录每行记录的rowid,这样一万行,那就是连续的一万,然后随机,用该随机rowid回表查询该行记录
 

来自 极客时间 msql实战 林晓斌写的 非常好 推荐

原文地址:https://www.cnblogs.com/weiluoyan/p/10409103.html