仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 652|回复: 8
打印 上一主题 下一主题

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

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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的事情。这个站点拥有博客、指南、视频、技术交流会、白皮书和论坛等方式的交流。
因胸联盟 该用户已被删除
沙发
发表于 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触发器以前根本没用过。
谁可相欹 该用户已被删除
5#
发表于 2015-2-8 19:58:50 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
兰色精灵 该用户已被删除
6#
发表于 2015-2-26 02:16:18 | 只看该作者
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
admin 该用户已被删除
7#
发表于 2015-3-8 11:27:57 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
透明 该用户已被删除
8#
 楼主| 发表于 2015-3-15 22:24:45 | 只看该作者
是要和操作系统进行Socket通讯的场景。否则建议慎重!
乐观 该用户已被删除
9#
发表于 2015-3-22 17:09:50 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-10 20:07

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表