从mysql随机取1条记录

从mysql随机取1条记录

ID:34736964

大小:57.88 KB

页数:10页

时间:2019-03-10

从mysql随机取1条记录_第1页
从mysql随机取1条记录_第2页
从mysql随机取1条记录_第3页
从mysql随机取1条记录_第4页
从mysql随机取1条记录_第5页
资源描述:

《从mysql随机取1条记录》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、从MySQL随机取1条记录之前有位朋友提到从MySQL随机取1条记录其实只要SELECT*FROMtableORDERBYRAND()LIMIT1即可。其实这个语句有很大的性能问题,对于大表的效率是非常低下的。我们可以看一下MySQL对其的解释:EXPLAINSELECT*FROM`money_logs`ORDERBYRAND()LIMIT1idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEtableALLNULLNULLNULLNULL173784Usingtemp

2、orary;Usingfilesort这个SQL语句无法使用任何索引,还必须使用临时表和文件排序,在一个15万条记录的MyISAM表需要花大约0.3秒。已经是相当慢的了。如何优化,请往下看:第一个例子我们先假设ID是从1开始并且1和ID的最大值之间没有任何空档。将工作移入应用程序第一个想法:如果我们可以事先在应用程序中计算出ID,那么就可以简化整个工作。SELECTMAX(id)FROMrandom;##在应用程序中生成随机idSELECTnameFROMrandomWHEREid=由于MAX(id)==COUNT(id)

3、我们只要生成从1到MAX(id)之间一个随机数,并将其传给数据库并取回随机行。上面第一个SELECT基本上是一个可以被优化掉的空操作。第二个是一个针对常量的eq_ref查询,同样也很快。将任务放入数据库不过有必要将其放入应用程序吗?难道我们不能在数据库里完成?#生成一个随机ID>SELECTRAND()*MAX(id)FROMrandom;+------------------+

4、RAND()*MAX(id)

5、+------------------+

6、689.37582507297

7、+------------------+#喔,这是一个浮点数,

8、不过我们需要整数>SELECTCEIL(RAND()*MAX(id))FROMrandom;+-------------------------+

9、CEIL(RAND()*MAX(id))

10、+-------------------------+

11、1000000

12、+-------------------------+#好多了。不过性能如何?>EXPLAINSELECTCEIL(RAND()*MAX(id))FROMrandom;+----+-------------+-------+-------+------+-------------+

13、id

14、

15、select_type

16、table

17、type

18、rows

19、Extra

20、+----+-------------+-------+-------+------+-------------+

21、1

22、SIMPLE

23、random

24、index

25、1000000

26、Usingindex

27、+----+-------------+-------+-------+------+-------------+##一个索引扫描?我们没有对MAX()进行优化>EXPLAINSELECTCEIL(RAND()*(SELECTMAX(id)FROMrandom));+----+--

28、-----------+-------+------+------+------------------------------+

29、id

30、select_type

31、table

32、type

33、rows

34、Extra

35、+----+-------------+-------+------+------+------------------------------+

36、1

37、PRIMARY

38、NULL

39、NULL

40、NULL

41、Notablesused

42、

43、2

44、SUBQUERY

45、NULL

46、NULL

47、NULL

48、Selecttablesoptimizedaway

49、+----+-

50、------------+-------+------+------+------------------------------+##一个简单的子查询给我们将性能找了回来。OK,现在我们知道如何生成随机ID了,不过如何获取记录行?>EXPLAINSELECTnameFROMrandomWHEREid=(SELECTCEIL(RAND()*(SELECTMAX(id)FROMrandom));+----+-------------+--------+------+---------------+------+---------+------+-

51、--------+------------------------------+

52、id

53、select_type

54、table

55、type

56、possible

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。