表A很简单,三个字段
id自增量
cat分类
content内容我想根据cat获取一条随机的记录,请问这个应该怎么写,表的记录数大概有10万条SELECT * FROM A where cat=2 ORDER BY rand() LIMIT 1这样效率太差,请问有别的办法吗?

解决方案 »

  1. cat上有索引? 看不出有什么问题。
      

  2. cat有索引,表结构非常简单。查询一次差不多要3-4秒。
      

  3. 10万条记录,要分类,如果落在分类区间记录比较多,在排序的情况下,确实有些慢。
    不要改SQL语句了,
    改系统配置参数,把key buffer, sort buffer调大些。
      

  4. 有没有别的办法,我不需要效率非常高,这个也没有并发,目的是通过cat查询出一条随机的记录。
    我后来计算出某个cat的总数,然后用limit x,1这样也是非常慢,这是什么原因?
      

  5. 你要实现何种目的。
    如果只是随机排序,建议给他一个参数,效率不会那么差的。如下:
      select * from tb_name order by rand(1200);
      

  6. cat上有索引吗?
    执行计划分析一下:explain select * from A where cat=2 order by  rand() limit 1;
      

  7. SELECT * FROM A 
    WHERE cat=2 and id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM A)-(SELECT MIN(id) FROM A)) + (SELECT MIN(id) FROM A))) 
    ORDER BY id LIMIT 1;
      

  8. 假设你的数据平均分布, 比如不是CAT=2的全部都排在表的前端,可以用如下方法。SELECT * FROM A 
    where cat=2 
    and ID> rand() * (select count(*) from A) 
    limit 1
      

  9. 跟limit没关系,因为你这个要按照rand()值进行排序。
      


  10. 这个稍微改一下就可以了
    SELECT * FROM A 
    WHERE cat=2 and id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM A WHERE cat=2)-(SELECT MIN(id) FROM A WHERE cat=2)) + (SELECT MIN(id) FROM A WHERE cat=2))) 
    ORDER BY id LIMIT 1;多谢了。
      

类似问题 »