我在做一個(gè)隨機(jī)出題的小應(yīng)用,需要在mysql數(shù)據(jù)庫的題庫表里隨機(jī)選出任意條數(shù)據(jù)作為題目,每條數(shù)據(jù)為一道題目,從網(wǎng)上查了很多資料,基本上有兩種,一種是使用 ORDER BY rand()語句,這個(gè)語句可以實(shí)現(xiàn)取任意條數(shù)據(jù),但是官網(wǎng)提示數(shù)據(jù)量大時(shí)內(nèi)存消耗會(huì)很大,查詢會(huì)很慢,另一種是SELECT table. *FROM(SELECT ROUND(RAND() * (SELECT MAX(id)FROMtable)) random_num,@num:=@num + 1FROM(SELECT @num:=0) AS a, tableLIMIT N) AS b,table AS tWHEREb.random_num = t.id;這種語句有一個(gè)問題,就是我想選出20條數(shù)據(jù),有時(shí)候會(huì)返回19條,就是會(huì)出現(xiàn)返回?cái)?shù)據(jù)不夠的情況,請(qǐng)問各位大神有什么好辦法沒?最好返回的數(shù)據(jù)可以不按自增長(zhǎng)id排序,題目順序需要打亂。
2 回答

米琪卡哇伊
TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果在where 子句中使用參數(shù),會(huì)導(dǎo)致全表掃描。
因?yàn)镾QL只有在運(yùn)行時(shí)才會(huì)解析局部變量,但優(yōu)化程序不能將訪問計(jì)劃的選擇推 遲到運(yùn)行時(shí);
它必須在編譯時(shí)進(jìn)行選擇。然而,如果在編譯時(shí)建立訪問計(jì)劃,變量的值還是未知的,因而無法作為索引選擇的輸入項(xiàng)。
你的這個(gè)sql多重嵌套使用參數(shù) 你算算多少次全表掃描了。個(gè)人覺得這個(gè)需求完全可以由程序來做,只需要寫簡(jiǎn)單的sql,動(dòng)態(tài)生成sql。
添加回答
舉報(bào)
0/150
提交
取消