|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
到2009年,甲骨文的数据库Oracle已经诞生了30周年,而MySQL却连它的一半时间都没有。微软的SQLServer仅仅比MySQL大两年,但是SQLServer的发布是建立在Sybase的基础上。比来因为必要也许研讨了一下MYSQL的随机抽取完成办法。举个例子,要从tablename表中随机提取一笔记录,人人一样平常的写法就是:SELECT*FROMtablenameORDERBYRAND()LIMIT1。
可是,厥后我查了一下MYSQL的官方手册,内里针对RAND()的提醒也许意义就是,在ORDERBY从句内里不克不及利用RAND()函数,由于如许会招致数据列被屡次扫描。可是在MYSQL3.23版本中,仍旧能够经由过程ORDERBYRAND()来完成随机。
可是真正测试一下才发明如许效力十分低。一个15万余条的库,查询5条数据,竟然要8秒以上。检察官方手册,也说rand()放在ORDERBY子句中会被实行屡次,天然效力及很低。
搜刮Google,网上基础上都是查询max(id)*rand()来随机猎取数据。
SELECT*FROM`table`ASt1JOIN(SELECTROUND(RAND()*(SELECTMAX(id)FROM`table`))ASid)ASt2WHEREt1.id>=t2.idORDERBYt1.idASCLIMIT5;
可是如许会发生一连的5笔记录。办理举措只能是每次查询一条,查询5次。即使云云也值得,由于15万条的表,查询只必要0.01秒不到。
上面的语句接纳的是JOIN,mysql的论坛上有人利用
SELECT*FROM`table`WHEREid>=(SELECTFLOOR(MAX(id)*RAND())FROM`table`)ORDERBYidLIMIT1;
我测试了一下,必要0.5秒,速率也不错,可是跟下面的语句仍是有很年夜差异。总觉有甚么中央不一般。
因而我把语句改写了一下。
SELECT*FROM`table`
WHEREid>=(SELECTfloor(RAND()*(SELECTMAX(id)FROM`table`)))
ORDERBYidLIMIT1;
这下,效力又进步了,查询工夫只要0.01秒
最初,再把语句完美一下,加上MIN(id)的判别。我在最入手下手测试的时分,就是由于没有加上MIN(id)的判别,了局有一半的工夫老是查询到表中的后面几行。
完全查询语句是:
SELECT*FROM`table`
WHEREid>=(SELECTfloor(RAND()*((SELECTMAX(id)FROM`table`)-(SELECTMIN(id)FROM`table`))+(SELECTMIN(id)FROM`table`)))
ORDERBYidLIMIT1;
SELECT*
FROM`table`ASt1JOIN(SELECTROUND(RAND()*((SELECTMAX(id)FROM`table`)-(SELECTMIN(id)FROM`table`))+(SELECTMIN(id)FROM`table`))ASid)ASt2
WHEREt1.id>=t2.id
ORDERBYt1.idLIMIT1;
最初在php中对这两个语句举行分离查询10次,
前者消费工夫0.147433秒
后者消费工夫0.015130秒
看来接纳JOIN的语法比间接在WHERE中利用函数效力还要高良多。<Pstyle="TEXT-INDENT:2em">
对免费版的用户也具有充足的支持服务。在dev.mysql.com上,一个大型的MySQL学习教程强大社区用户和开发者可以讨论所有关于MySQL的事情。这个站点拥有博客、指南、视频、技术交流会、白皮书和论坛等方式的交流。 |
|