透明 发表于 2015-1-16 22:14:53

MYSQL网页编程之mysql 数据库查询随机数目条目标效力问...

到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的事情。这个站点拥有博客、指南、视频、技术交流会、白皮书和论坛等方式的交流。

因胸联盟 发表于 2015-1-19 05:59:04

对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。

柔情似水 发表于 2015-1-25 15:56:05

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。

再现理想 发表于 2015-2-3 06:06:54

但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。

谁可相欹 发表于 2015-2-8 19:58:50

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力

兰色精灵 发表于 2015-2-26 02:16:18

比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。

admin 发表于 2015-3-8 11:27:57

所以你总能得到相应的升级版本,来满足你的需求。

透明 发表于 2015-3-15 22:24:45

是要和操作系统进行Socket通讯的场景。否则建议慎重!

乐观 发表于 2015-3-22 17:09:50

始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
页: [1]
查看完整版本: MYSQL网页编程之mysql 数据库查询随机数目条目标效力问...