易截截图软件、单文件、免安装、纯绿色、仅160KB

mysql使用rand随机查询记录效率测试

一直以为mysql随机查询几条数据,就用
SELECT * from `table` ORDER BY RAND() LIMIT 5
就可以了。
但是真正测试一下才发现这样效率非常低。一个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;
这下,效率又提高了,查询时间只有0.01秒
最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:
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;
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 t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。


相关文档:

MySQL Reference Manual中文版

MySQL Reference Manual for version 4.1.0-alpha.
 译者序
 列类型与函数索引
6 MySQL 语言参考

6.1 语言结构

6.1.1 文字:怎么写字符串与数字

6.1.1.1 字符串

 
6.1.1.2 数字

 
6.1.1.3 十六进制值
......

找到MySQL的优点

假设你是一个Access开发人员,而你想移植一个Access后台到一个本地的MySQL 服务器用于开发和测试。你将维护你自己的解决方案并乐于使用Community Server
  第一步——安装MySQL
  到http://dev.mysql.com/downloads/ 下载这个服务器、MySQL GUI工具和MySQL ODBC驱动。你可以选择的服务器有:5.0, 5.1或6.0 ......

Windows7装不上Mysql解决方案

初次安装方法:
1、去官方下载MYSQL 5.0。
  2、修改防火墙的设置,在允许例外里添加新的端口,名字为mysql,开放的端口为TCP 3306。
  这个大家应该都会,在Vista控制面板的Windows防火墙里面,点击“更改设置”-“例外”,点击“添加端口”就可以。  
     ......

MySQL引擎简介

MySQL是我们比较常用的一种数据
库软件。它有着诸多的优点,如开源的,免费的等等。其实它还有一个很好的特点,那就是有多种引擎可以供你选择。如果赛
车手能根据不同的路况,地形随手更换与之最适宜的引擎,那么他们将创造奇迹。然而目前他们还做不到那样便捷的更换引擎,但是我们却可以!
     所 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号