Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6683707
  • 博文数量: 1005
  • 博客积分: 8199
  • 博客等级: 中将
  • 技术积分: 13071
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-25 20:19
个人简介

脚踏实地、勇往直前!

文章分类

全部博文(1005)

文章存档

2020年(2)

2019年(93)

2018年(208)

2017年(81)

2016年(49)

2015年(50)

2014年(170)

2013年(52)

2012年(177)

2011年(93)

2010年(30)

分类: Mysql/postgreSQL

2014-08-25 17:54:26


通常情况下我们使用如下的语句随机返回一条记录数
SELECT * FROM tb_dic_class ORDER BY RAND() LIMIT 1,测试发现这个方法并不是最优化的,下面列举了一个效率更好的例子:

1.表记录数
mysql> SELECT count(1) FROM tb_dic_class;
+----------+
| count(1) |
+----------+
|  1000000 |
+----------+
1 row in set (0.37 sec)

2.常用的返回随机记录的方法

mysql>
SELECT * FROM tb_dic_class ORDER BY RAND() LIMIT 1 \G;
*************************** 1. row ***************************
  class_id: 839335
class_name: 839335班
createtime: 2014-08-18 14:27:23
modifytime: 2014-08-18 14:27:23
1 row in set (8.69 sec)

ERROR:
No query specified


3.效率更好的方法

mysql> SELECT * FROM tb_dic_class AS t1
    ->   JOIN (SELECT ROUND(RAND() *
    ->           (SELECT MAX(class_id) FROM tb_dic_class)) AS id) AS t2 WHERE t1.class_id >= t2.id ORDER BY t1.class_id ASC LIMIT 1 \G;
*************************** 1. row ***************************
  class_id: 400243
class_name: 400243班
createtime: 2014-08-18 14:25:23
modifytime: 2014-08-18 14:25:23
        id: 400243
1 row in set (1.18 sec)

ERROR:
No query specified

4.下面这个查询效果更佳
mysql> SELECT *
    -> FROM tb_dic_class AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(class_id) FROM tb_dic_class)-(SELECT MIN(class_id) FROM tb_dic_class))+(SELECT MIN(class_id) FROM tb_dic_class)) AS id) AS t2
    -> WHERE t1.class_id >= t2.id
    -> ORDER BY t1.class_id LIMIT 1;
+----------+------------+---------------------+---------------------+--------+
| class_id | class_name | createtime          | modifytime          | id     |
+----------+------------+---------------------+---------------------+--------+
|   448629 | 448629班   | 2014-08-18 14:25:36 | 2014-08-18 14:25:36 | 448629 |
+----------+------------+---------------------+---------------------+--------+
1 row in set (0.20 sec)

--The End --

阅读(4962) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

菊花侠2014-08-27 14:54:38

不错 顶一个