时间: 2009-08-23 / 分类: WEB后端编程 - 开发与实践 / 浏览次数: / 0 个评论 发表评论
SQL中的可以随机取得记录随机函数及MySQL效率
项目前端开发的架构
12条经典摄影技巧
CSS Hack浏览器兼容IE6+IE7+IE8+IE9+FF
WEB前端开发中的一些编程风格和书...

SQL中的可以随机取得记录随机函数,用这个函数,可以编写随机的文章。

sql server的随机函数newID()和RAND()

SELECT * FROM Northwind..Orders ORDER BY NEWID()

sql server的随机排序

SELECT TOP 10 * FROM Northwind..Orders ORDER BY NEWID()

从Orders表中随机取出10条记录  

MsSql随机取数据

select top 10 * from c_cy_admin order by newid()

随机取数据

select SELECT top 10 id FROM 表1 order by rnd(id)

随机取数据

SELECT id FROM gueze order by rand() limit 10

如果MySQL中用rand()取随机值,从效率上来说是不好的的。
MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND(),因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。

SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id ASC LIMIT 5;

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
下面的语句采用的是JOIN,mysql的论坛上有人使用

SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;

需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距,修改一下:

SELECT * FROM `table` WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) ORDER BY id LIMIT 1;

把语句完善一下,加上MIN(id)的判断。在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:

直接用WHERE

SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
ORDER BY id LIMIT 1;

 用Join语法

SELECT *FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2WHERE t1.id >= t2.idORDER BY t1.id LIMIT 1;

最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多

参考:http://www.xueit.com/html/2009-01/30_272_00.html

      站点地图 | 关于我 | 返回顶部
    Copyright © 2001-2013 { amiku.cn | zhangshunjin.com }. Powered by 

    阿米酷

    张顺金


    浙ICP备11002820号-1