• 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实战 林晓斌写的 非常好 推荐

  • 相关阅读:
    BZOJ3036: 绿豆蛙的归宿
    BZOJ1419: Red is good
    BZOJ1013: [JSOI2008]球形空间产生器sphere
    BZOJ1415: [Noi2005]聪聪和可可
    BZOJ1417: Pku3156 Interconnect
    BZOJ1076: [SCOI2008]奖励关
    BZOJ2318: Spoj4060 game with probability Problem
    BZOJ1426: 收集邮票
    BZOJ2720: [Violet 5]列队春游
    BZOJ2698染色
  • 原文地址:https://www.cnblogs.com/weiluoyan/p/10409103.html
Copyright © 2020-2023  润新知