在
mysql
中查詢5
條不重複的資料,使用以下:
select
* from
`table
`order
byrand
()limit
5就可以了。但是真正測試一下才發現這樣效率非常低。乙個
15萬餘條的庫,查詢
5條資料,居然要
8秒以上
搜尋google
,網上基本上都是查詢
max(id) * rand()
來隨機獲取資料。
select
* from
`table`as
t1join
(select
round
(rand
()*
(select
max(id)
from
`table`))
asid)as
t2wheret1.
id>= t2.
idorder
byt1.id
asclimit5;
但是這樣會產生連續的
5條記錄。解決辦法只能是每次查詢一條,查詢
5次。即便如此也值得,因為
15萬條的表,查詢只需要
0.01
秒不到。
上面的語句採用的是
join
,mysql
的論壇上有人使用
select
* from
`table
`where
id>=
(select
floor
(max(id
)* rand
())from
`table`)
order
byid
limit1;
我測試了一下,需要
0.5秒,速度也不錯,但是跟上面的語句還是有很大差距。總覺有什麼地方不正常。
於是我把語句改寫了一下。
select
* from
`table
`where
id>=
(select
floor
(rand
()*
(select
max(id)
from
`table
`)))
order
byid
limit1;
這下,效率又提高了,查詢時間只有
0.01
秒最後,再把語句完善一下,加上
min(id)
的判斷。我在最開始測試的時候,就是因為沒有加上
min(id)
的判斷,結果有一半的時間總是查詢到表中的前面幾行。
完整查詢語句是:
select
* from
`table
`where
id>=
(select
floor
(rand
()*
((select
max(id)
from
`table`)
-(select
min(id)
from
`table`))
+ (select
min(id)
from
`table
`)))
order
byid
limit1;
select
* from
`table`as
t1join
(select
round
(rand
()*
((select
max(id)
from
`table`)
-(select
min(id)
from
`table`))
+(select
min(id)
from
`table`))
asid)as
t2wheret1.
id>= t2.
idorder
byt1.id
limit1;
最後對這兩個語句進行分別查詢
10次,
前者花費時間
0.147433
秒後者花費時間
0.015130
秒看來採用
join
的語法比直接在
where
中使用函式效率還要高很多。
mysql隨機查詢若干條資料
在mysql中查詢5條不重複的資料,使用以下 select from table order by rand limit 5 就可以了。但是真正測試一下才發現這樣效率非常低。乙個15萬餘條的庫,查詢5條資料,居然要8秒以上 搜尋google,網上基本上都是查詢max id rand 來隨機獲取資料。...
mysql隨機查詢若干條資料
mysql隨機查詢若干條資料 在mysql中查詢5條不重複的資料,使用以下 select from table order by rand limit 5 就可以了。但是真正測試一下才發現這樣效率非常低。乙個15萬餘條的庫,查詢5條資料,居然要8秒以上 搜尋google,網上基本上都是查詢max i...
mysql隨機查詢若干條資料的方法
在mysql中查詢5條不重複的資料,使用以下 如下 select from table order by rand limit 5 就可以了。但是真正測試一下才發現這樣效率非常低。乙個15萬餘條的庫,查詢5條資料,居然要8秒以上 搜尋google,網上基本上都是查詢max id rand 來隨機獲取...