表A很简单,三个字段
id自增量
cat分类
content内容我想根据cat获取一条随机的记录,请问这个应该怎么写,表的记录数大概有10万条SELECT * FROM A where cat=2 ORDER BY rand() LIMIT 1这样效率太差,请问有别的办法吗?
id自增量
cat分类
content内容我想根据cat获取一条随机的记录,请问这个应该怎么写,表的记录数大概有10万条SELECT * FROM A where cat=2 ORDER BY rand() LIMIT 1这样效率太差,请问有别的办法吗?
解决方案 »
- mysql中的key是什么意思?
- 求一SQL语句用来确定IP是属于数据库IP段哪个范围
- 创建外键失败,不知原因
- ERROR 1194 (HY000): Table 'links' is marked as crashed and should be repaired
- 遇到一件无赖的事,
- 远程备份的问题
- 请问,在oracle里面的to_char和to_number这两个函数在mysql是什么
- 昏头了~~问个问题~~
- 通过java向Mysql中插入图片
- 请问这个有没有办法只最后返回一个结果集
- PHP+MYSQL max min 与limit匹配的问题(急)
- 请问下现在mysql哪个版本较好?目前最新为5.5.28
不要改SQL语句了,
改系统配置参数,把key buffer, sort buffer调大些。
我后来计算出某个cat的总数,然后用limit x,1这样也是非常慢,这是什么原因?
如果只是随机排序,建议给他一个参数,效率不会那么差的。如下:
select * from tb_name order by rand(1200);
执行计划分析一下:explain select * from A where cat=2 order by rand() limit 1;
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;
where cat=2
and ID> rand() * (select count(*) from A)
limit 1
这个稍微改一下就可以了
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;多谢了。