mysql多表随机查询优化方案

mysql多表随机查询优化方案

ID:27670361

大小:77.50 KB

页数:12页

时间:2018-12-05

mysql多表随机查询优化方案_第1页
mysql多表随机查询优化方案_第2页
mysql多表随机查询优化方案_第3页
mysql多表随机查询优化方案_第4页
mysql多表随机查询优化方案_第5页
资源描述:

《mysql多表随机查询优化方案》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、mysql多表随机查询优化方案我以前介绍过最多的就是单表随机查询时的优化了,今天看到一站长分享了一个多表随机查询优化的一些方法与方案,下面我们就一起来看看吧.本文主要谈论如何实现Mysql的随机查询,多表随机查询。在Mysql中随机取出一条记录的实现方法。我们通常的查询是没有where或者wherefieldsgt;2这样的方式,这样只能取出在某种条件下的一条或多条,如果条件不变(例如2),那么结果就一直不会有变化。那么如何实现随机查询呢?本人有两种方法。方法一、数据表记录不大的情况下:select氺fromtable'查出来所有的记录列表,然后ar

2、ray_rand()随机出一个结果的数组的key。连续的key可以使用mt_rand(l,count($list));为什么不使用rand而是mt_rand呢?因为mt_rand币rand快4倍。这种情况下,查出整个列表,存入到Memcache的缓存或者Redis的NoSQL中,下次直接取出结果集而不需要查表。不过当数据量一旦超过万级别,取出列表就很困难了方法二:使用SQL语句随机MYSQL函数RANDO,产生一个0_1之间的小数,然后MAX('id')可以获得该表中最大的ID。那么MAX('id')*RANDO就可以取到表中所有的ID。0K,看语句

3、。SELECT*FROM'table'WHERE'id'gt;(SELECTRAND()*(SELECTMAX('id')FROM'table')LIMITO,1既然MAX('id')*MAX('id')可以取到表里所有值,那么本语句的WHERE就可以取到本表的所有情况,那么这就是一个所有记录都有可能被取到的随机SQL语句。补充另一篇文章1.多表连接类型1.笛卡尔积(交叉连接)在MySQL中可以为CROSSJOIN或者省略CROSS即JOIN,或者使用’,’如:SELECTOROMtablelCROSSJOINtable2SELECTSROMtabl

4、elJOINtable2SELECT*FROMtablel,table2由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE,ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢。一般使用LEFT[OUTER]JOIN或者RIGHT[OUTER]JOIN2.内连接INNERJOIN在MySQL中把INNERJOIN叫做等值连接,即需要指定等值连接条件在MySQL中CROSS和INNERJOIN被划分在一起。join_table:table_reference[INNER

5、CROSS]JOINtable_factor

6、[join_condition]3.MySQL中的外连接,分为左外连接和右连接,即除了返回符合连接条件的结果之外,还要返回左表(左连接)或者右表(右连接)中不符合连接条件的结果,相对应的使用NULL对应。例子:user表:id

7、name1libk2

8、zyfon3

9、daodaouser_action表:user_id

10、action1jump1

11、kick11jump2

12、run4

13、swimsql:selectid,name,actionfromuserasuleftjoinuser_actionaonu.id=a.user_idresult:id

14、name

15、

16、action1

17、libk

18、jump①1

19、libk

20、kick②1

21、libk

22、jump③21zyfon

23、run④3

24、daodao

25、null⑤分析:注意到user_action中还有一个user_id=4,action=swim的纪录,但是没有在结果中出现,而user表中的id=3,name=daodao的用户在user_action中没有相应的纪录,但是却出现在了结果集中因为现在是leftjoin,所有的工作以left为准.结果1,2,3,4都是既在左表又在右表的纪录,5是只在左表,不在右表的纪录工作原理:从左表读出一条,选出所有与on匹配的右表纪录(

26、n条)进行连接,形成n条纪录(包括重复的行,如:结果1和结果3),如果右边没有与on条件匹配的表,那连接的字段都是null.然后继续读下一条。引申:我们可以用右表没有on匹配则显示mil1的规律,来找出所有在左表,不在右表的纪录,注意用来判断的那列必须声明为notnull的。如:sql:selectid,name,actionfromuserasuleftjoinuser_actionaonu.id=a.user_idwherea.user_idisNULL(注意:1.列值为ntill应该用isnul1而不能用=风]!±2.这里a.user_id列必

27、须声明为NOTNULL的.)上面sql的result:id

28、name

29、action1daodaoNULL—般

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

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

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