SELECT p.id as productid,p.id,p.name as productname,p.clicked AS hits,p.name,p.price,picture,created,cache_companyname as companyname FROM pb_products p  WHERE p.industry_id1=729 ORDER BY rand() LIMIT 10;这个industry_id1是个索引,如果不加这个索引的话更慢
10来分钟去了
大家知道在类似这样的海量数据中,有什么办法可以取得随机数据呢?

解决方案 »

  1. 比较麻烦,这个ORDER BY rand() 会导致所有符合条件 p.industry_id1=729的记录都需要被扫描一遍,然后排完序后才能LIMIT 10;建议另找一种算法,来生成 id 的一个序列,比如随便生成10个符合条件的ID,然后进行查询。
      

  2. 这个order by rand() 在大表上效率很低下
    --原因:
    mysql要把所有的记录都读入内存里面去,在那里按随机顺序对他们进行排序,而这一切都为了选取一条记录。。
      

  3. 给你一个方法:
    不过只能做到随机取一条~~ 你的需求是10条~ 下面的方法可以保证一条随机后 下面9条会跟着那条随机1.给表加个随机列
    alter table tbName add colName double;
    2.给列加索引
    create index indexName on tbName(colName);
    3.给列加个随机值
    update tbName set colName=rand();
    4.接着你就可以使用啦
    select top 10 * from tbName where colName>rand() order by colName limit 10记住上面这个方法比较适用为limit 1 
    因为你找到第一个后 后面9条石跟着你的第一条的 不算真正意义上的随机 》。
      

  4. order by rand() 在大表上效率很低下建议另找一种算法,来生成 id 的一个序列,比如随便生成10个符合条件的ID,然后进行查询
      

  5. 使用覆盖索引试一试(这里假设id是主键)
    innodb 建立索引 industry_id1
    myisam 建立复合索引 (industry_id1,id)SELECT p.id as productid,p.id,p.name as productname,p.clicked AS hits,p.name,p.price,picture,created,cache_companyname as companyname FROM pb_products p inner join (select id from pb_products WHERE industry_id1=729 ORDER BY rand() LIMIT 10) as p1 on p.id=p2.id;
      

  6. 只有先建立索引,ORDER BY  LIMIT 才会快
    建立一个字段,在此字段上建立索引 ,替换为RAND,再查询
      

  7. loveflea这个很强大,基本上扫描时间在0.2-0.3秒之间
    厉害!
      

  8. 你不一定非要通过sql语句,可以借助一下程序,获取一个随机数,当然是你要查询的范围里的。举个例子假如一个表中有100W条数据(字段:id,uid,content),每次查询uid为58的随机的10条数据。
    首先第一步:用程序来获取一个随机数。
    $id=rand(1,1000000-10); 1000000-10是因为如果rand值得到的是10000000的话,可能就获取不到数据了。这样的话我们写sql语句就可以很轻松的实现了
    select id,uid,content from Table where uid=58 and id>'$id' limit 10
      

  9. 我有次去面试 题目就是 从一张有一千万数据的表随机取10十条 怎么取效率才最快
    我那时答是 先php 随机产生10个数 再 or id=*
    是要怎么取才最快?
      

类似问题 »