zoukankan      html  css  js  c++  java
  • 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实战 林晓斌写的 非常好 推荐

  • 相关阅读:
    React简介
    webpack处理项目中的资源文件
    ajax
    DOW
    webpack-css单独打包配置
    SSH配置
    html-webpack
    常用ui
    git命令备忘
    关于git的一些使用
  • 原文地址:https://www.cnblogs.com/weiluoyan/p/10409103.html
Copyright © 2011-2022 走看看