欢迎来到天天文库
浏览记录
ID:27670361
大小:77.50 KB
页数:12页
时间:2018-12-05
《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—般
此文档下载收益归作者所有