前天因為工作需要我把從一個5w記錄的資料庫中隨機抽取幾條記錄了,這裡我是直接使用mysql rand by函式來直接,eczxl幾千條記錄沒關係,但如果到了幾萬條感覺要幾秒,這個就很慢了,下面小編與大家一起來看看mysql 取隨機資料慢優化過程。
複製** **如下:
select * from tablename order by limit 1
但是,後來我查了一下mysql的官方手冊,裡面針對rand()的提示大概意思就是,在order by從句裡面不能使用rand()函式,因為這樣會導致資料列被多次掃描。但是在mysql 3.23版本中,仍然可以通過order by rand()來實現隨機。
測試一下才發現這樣效率非常低。一個15萬餘條的庫,查詢5條資料,居然要8秒以上。檢視官方手冊,也說rand()放在order by 子句中會被執行多次,自然效率及很低。
you cannot use a column with rand() values in an order by clause, because order by would evaluate the column multiple times.
搜尋google,網上基本上都是查詢max(id) * rand()來隨機獲取資料。
複製** **如下:
select *
from 'table' as t1 join (select round(rand() * (select max(id) from 'table')) as id) as t2
where t1.id >= t2.id
order by t1.id asc limit 5;
但是這樣會產生連續的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因為15萬條的表,查詢只需要0.01秒不到。
下面的語句採用的是join,mysql的論壇上有人使用:
複製** **如下:
select *
from 'table'
where id >= (select floor( max(id) * rand()) from 'table' )
order by id limit 1;
我eczxl測試了一下,需要0.5秒,速度也不錯,但是跟上面的語句還是有很大差距。總覺有什麼地方不正常。
於是把語句改寫了一下。
複製** **如下:
select * from 'table'
where id >= (select floor(rand() * (select max(id) from 'table')))
order by id limit 1;
這下,效率又提高了,查詢時間只有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 by id limit 1;
select * from 'table' as t1 join (
select round(
# 最小值 + (1 至 最小與最大值差)
rand() * (
(select max(id) from 'table')-(select min(id) from 'table')
) +(select min(id) from 'table')
) as id
) awww.cppcns.coms t2
where t1.id >= t2.id
order by t1.id limit 1;
最後在php中對這兩個語句進行分別查詢10次,前者花費時間 0.147433 秒,後者花費時間 0.015130 秒。看來採用join的語法比直接在where中使用函式效率還要高很多。
複製** **如下:
select *
from `table` as t1 join (select round(rand() * ((select max(id) from `table`) – (select min(id) from `table`)) + (select min(id) from `table`)) as id) as t2
where t1.id >= t2.id
order by t1.id limit 10;
這個就是我自己選用了,從以前5秒到現面0.0003秒時間都不用就查出10條記錄了。
本文標題: mysql優化取隨機資料慢的方法
本文地址: /shujuku/mysql/101091.html
mysql優化取隨機資料慢的方法
如下 select from tablename order by rand limit 1複製 但是,後來我查了一下mysql的官方手冊,裡面針對rand 的提示大概意思就是,在order by從句裡面不能使用rand 函式,因為這樣會導致資料列被多次掃描。但是在mysql 3.23版本中,仍然可...
mysql隨機取資料
從資料表隨機獲取n條資料記錄的方法有很多,其中最簡單的莫過於select from table where 1 order by rand limit n 這個語句得好處在於簡單,但前提條件是查詢的結果集必須小於5w記錄集的情況下方可使用,若資料結果集超過了5w,其查詢出來的速度將非常的耗資源。se...
MYSQL 隨機資料獲取
以下方法是前提where為空的時候,當存在where的時候效率非常低.網上目前流竄著各種取資料的方法,除了 select s rand as r from ko stars as s order by r limit 5 這種超低效率的方法外,好像都存在資料量獲取小於指定值的現象,因為網上的普遍方法...
隨機取資料
service this common model get records select catalog id from this db dbprefix shop service as t1 join select round rand select max id from this db dbp...
Mysql 隨機取一條資料
第一種select from t user grade order by rand limit 1order by rand 語句,這個語句可以實現取任意條資料,但是官網提示資料量大時記憶體消耗會很大,查詢會很慢 第二種 隨機生成一個id select from t user grade as t1...
mysql隨機獲取資料RAND 函式
有這樣一個場景,需要從200個商品中隨機獲取5個進行展示,mysql有一個rand 函式可以滿足需要,簡單記錄 mysql函式在內部被標記為確定性或不確定性。一個函式是不確定的,如果給定其引數的固定值,它可以為不同的呼叫返回不同的結果。非確定性函式的例子 rand uuid 這裡主要描述rand 的...
ecliplse啟動慢的優化方法(親測有效)
本人使用的ecliplse ide 版本是 version photon release 4.8.0 build id 20180619 1200 我的電腦配置是 ecliplse啟動差不多一分鐘左右,很慢了,後來在網上查了許多方法都沒有用,最後通過下面的方法,產生了奇效!勃起只需10秒!下面我就簡...
十 mysql資料優化 快取
一 快取講解 一般情況下是客戶端傳送請求,然後 web伺服器收集請求,然後直接傳送給資料庫伺服器,資料庫伺服器進行處理之後反饋給 web伺服器,但是由於資料庫伺服器自身的處理能力有限,所以不能滿足請求都能很快進行處理,為了減輕資料庫伺服器的效能壓力,所以引進了快取 首先,web伺服器收集請求後會傳送...
mysql慢日誌優化 Mysql優化 慢sql日誌
一.開啟慢sql日誌捕獲慢sql 1.查詢mysql是否開啟慢sql捕獲 show variables like slow query log 預設為off,開啟 set global slow query log 1 2.檢視慢查詢時間閾值 show variables like long que...
MySQL隨機獲取資料的方法,支援大資料量
select from table name order by rand limit 5 複製 rand在手冊裡是這麼說的 rand rand n 返回在範圍0到1.0內的隨機浮點值。如果一個整數引數n被指定,它被用作種子值。mysql selectrand 0.5925 mysql selectr...