資源描述:
《mysql多表隨機(jī)查詢優(yōu)化方案》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。
1、mysql多表隨機(jī)查詢優(yōu)化方案我以前介紹過(guò)最多的就是單表隨機(jī)查詢時(shí)的優(yōu)化了,今天看到一站長(zhǎng)分享了一個(gè)多表隨機(jī)查詢優(yōu)化的一些方法與方案,下面我們就一起來(lái)看看吧.本文主要談?wù)撊绾螌?shí)現(xiàn)Mysql的隨機(jī)查詢,多表隨機(jī)查詢。在Mysql中隨機(jī)取出一條記錄的實(shí)現(xiàn)方法。我們通常的查詢是沒(méi)有where或者wherefieldsgt;2這樣的方式,這樣只能取出在某種條件下的一條或多條,如果條件不變(例如2),那么結(jié)果就一直不會(huì)有變化。那么如何實(shí)現(xiàn)隨機(jī)查詢呢?本人有兩種方法。方法一、數(shù)據(jù)表記錄不大的情況下:select氺fromtable'查出來(lái)所有的記錄列表,然后ar
2、ray_rand()隨機(jī)出一個(gè)結(jié)果的數(shù)組的key。連續(xù)的key可以使用mt_rand(l,count($list));為什么不使用rand而是mt_rand呢?因?yàn)閙t_rand幣rand快4倍。這種情況下,查出整個(gè)列表,存入到Memcache的緩存或者Redis的NoSQL中,下次直接取出結(jié)果集而不需要查表。不過(guò)當(dāng)數(shù)據(jù)量一旦超過(guò)萬(wàn)級(jí)別,取出列表就很困難了方法二:使用SQL語(yǔ)句隨機(jī)MYSQL函數(shù)RANDO,產(chǎn)生一個(gè)0_1之間的小數(shù),然后MAX('id')可以獲得該表中最大的ID。那么MAX('id')*RANDO就可以取到表中所有的ID。0K,看語(yǔ)句
3、。SELECT*FROM'table'WHERE'id'gt;(SELECTRAND()*(SELECTMAX('id')FROM'table')LIMITO,1既然MAX('id')*MAX('id')可以取到表里所有值,那么本語(yǔ)句的WHERE就可以取到本表的所有情況,那么這就是一個(gè)所有記錄都有可能被取到的隨機(jī)SQL語(yǔ)句。補(bǔ)充另一篇文章1.多表連接類型1.笛卡爾積(交叉連接)在MySQL中可以為CROSSJOIN或者省略CROSS即JOIN,或者使用’,’如:SELECTOROMtablelCROSSJOINtable2SELECTSROMtabl
4、elJOINtable2SELECT*FROMtablel,table2由于其返回的結(jié)果為被連接的兩個(gè)數(shù)據(jù)表的乘積,因此當(dāng)有WHERE,ON或USING條件的時(shí)候一般不建議使用,因?yàn)楫?dāng)數(shù)據(jù)表項(xiàng)目太多的時(shí)候,會(huì)非常慢。一般使用LEFT[OUTER]JOIN或者RIGHT[OUTER]JOIN2.內(nèi)連接INNERJOIN在MySQL中把INNERJOIN叫做等值連接,即需要指定等值連接條件在MySQL中CROSS和INNERJOIN被劃分在一起。join_table:table_reference[INNER
5、CROSS]JOINtable_factor
6、[join_condition]3.MySQL中的外連接,分為左外連接和右連接,即除了返回符合連接條件的結(jié)果之外,還要返回左表(左連接)或者右表(右連接)中不符合連接條件的結(jié)果,相對(duì)應(yīng)的使用NULL對(duì)應(yīng)。例子: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中還有一個(gè)user_id=4,action=swim的紀(jì)錄,但是沒(méi)有在結(jié)果中出現(xiàn),而user表中的id=3,name=daodao的用戶在user_action中沒(méi)有相應(yīng)的紀(jì)錄,但是卻出現(xiàn)在了結(jié)果集中因?yàn)楝F(xiàn)在是leftjoin,所有的工作以left為準(zhǔn).結(jié)果1,2,3,4都是既在左表又在右表的紀(jì)錄,5是只在左表,不在右表的紀(jì)錄工作原理:從左表讀出一條,選出所有與on匹配的右表紀(jì)錄(
26、n條)進(jìn)行連接,形成n條紀(jì)錄(包括重復(fù)的行,如:結(jié)果1和結(jié)果3),如果右邊沒(méi)有與on條件匹配的表,那連接的字段都是null.然后繼續(xù)讀下一條。引申:我們可以用右表沒(méi)有on匹配則顯示mil1的規(guī)律,來(lái)找出所有在左表,不在右表的紀(jì)錄,注意用來(lái)判斷的那列必須聲明為notnull的。如:sql:selectid,name,actionfromuserasuleftjoinuser_actionaonu.id=a.user_idwherea.user_idisNULL(注意:1.列值為ntill應(yīng)該用isnul1而不能用=風(fēng)]!±2.這里a.user_id列必
27、須聲明為NOTNULL的.)上面sql的result:id
28、name
29、action1daodaoNULL—般