我在做一個隨機出題的小應用,需要在mysql數(shù)據(jù)庫的題庫表里隨機選出任意條數(shù)據(jù)作為題目,每條數(shù)據(jù)為一道題目,從網(wǎng)上查了很多資料,基本上有兩種,一種是使用 ORDER BY rand()語句,這個語句可以實現(xiàn)取任意條數(shù)據(jù),但是官網(wǎng)提示數(shù)據(jù)量大時內存消耗會很大,查詢會很慢,另一種是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;這種語句有一個問題,就是我想選出20條數(shù)據(jù),有時候會返回19條,就是會出現(xiàn)返回數(shù)據(jù)不夠的情況,請問各位大神有什么好辦法沒?最好返回的數(shù)據(jù)可以不按自增長id排序,題目順序需要打亂。
2 回答

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