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

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