1. 程式人生 > >mysql隨機查詢若干條資料

mysql隨機查詢若干條資料

mysql中查詢5條不重複的資料,使用以下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

SELECT * FROM`table`ORDERBYRAND()LIMIT5

就可以了。但是真正測試一下才發現這樣效率非常低。一個15萬餘條的庫,查詢5條資料,居然要8秒以上

搜尋Google,網上基本上都是查詢max(id) * rand()來隨機獲取資料。

SELECT *
FROM`table`ASt1JOIN(SELECTROUND(<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />RAND

() * (SELECTMAX(id)FROM`table`))ASid)ASt2WHEREt1.id >= t2.idORDERBYt1.idASCLIMIT5;

但是這樣會產生連續的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因為15萬條的表,查詢只需要0.01秒不到。

上面的語句採用的是JOINmysql的論壇上有人使用

SELECT *
FROM`table`WHEREid >= (SELECTFLOOR(MAX(id) * RAND())FROM`table`)ORDERBYidLIMIT1;

我測試了一下,需要0.5秒,速度也不錯,但是跟上面的語句還是有很大差距。總覺有什麼地方不正常。

於是我把語句改寫了一下。

SELECT * FROM`table`WHEREid >= (SELECTfloor(RAND() * (SELECTMAX(id)FROM`table`)))ORDERBYidLIMIT1;

這下,效率又提高了,查詢時間只有0.01

最後,再把語句完善一下,加上MIN(id)的判斷。我在最開始測試的時候,就是因為沒有加上MIN(id)的判斷,結果有一半的時間總是查詢到表中的前面幾行。完整查詢語句是:

SELECT * FROM`table`WHEREid >= (SELECTfloor(RAND() * ((SELECTMAX(id)FROM`table`)-(

SELECTMIN(id)FROM`table`)) + (SELECTMIN(id)FROM`table`)))ORDERBYidLIMIT1;

SELECT *
FROM`table`ASt1JOIN(SELECTROUND(RAND() * ((SELECTMAX(id)FROM`table`)-(SELECTMIN(id)FROM`table`))+(SELECTMIN(id)FROM`table`))ASid)ASt2WHEREt1.id >= t2.idORDERBYt1.idLIMIT1;

最後對這兩個語句進行分別查詢10次,前者花費時間 0.147433 後者花費時間 0.015130 看來採用JOIN的語法比直接在WHERE中使用函式效率還要高很多。