資料庫隨機請求表中任意一行優化(使用rand函式)

2021-08-20 07:10:39 字數 1606 閱讀 6038

從2500多行的表中隨機取一行,使用rand函式:

select * from tbl_nichuiniu_article  where category='z1'

order

by rand() limit 1;

查詢結果顯示掃表兩遍,order by rand() 需要使用臨時表(using temporary),需要使用檔案排序(using filesort),效率低下,查詢時間800毫秒

網上找了個方法優化後,10毫秒,效能顯著提公升

select * from tbl_nichuiniu_article 

where category='z1'

and id >= (select floor( rand() * ((select

max(id) from tbl_nichuiniu_article)-(select

min(id) from tbl_nichuiniu_article)) + (select

min(id) from tbl_nichuiniu_article)))

order

by id limit 1;

0602更新

實際使用一段時間上面的sql後,發現每次隨機請求到的id都是偏小的,隨機的區間只有總數的前10%。於是再次更新sql:

select * from tbl_nichuiniu_article as t1 join (

select floor( rand() * ((select

max(id) from tbl_nichuiniu_article)-(select

min(id) from tbl_nichuiniu_article)) +

(select

min(id) from tbl_nichuiniu_article)) as id) as t2

where t1.id >= t2.id

order

by t1.id asc limit 1;

select floor( rand() * ((select

max(id) from tbl_nichuiniu_article)-(select

min(id) from tbl_nichuiniu_article)) +

(select

min(id) from tbl_nichuiniu_article))

但是聯合成一整個語句查詢時,隨機到的數字卻很小。

原因是上面的sql查詢出來的結果實際上是作為一張表。

使用下面的語句id>= 對應的應該是乙個字段,而不是一張表。

select * from tbl_nichuiniu_article where category='z1'

and id >=

所以如果要對應一張查詢出來的新錶,就需要使用左連線。

0602再次更新

最開始的用法語句是沒有報錯的,出問題的還是隨機數生成的過程與select語句結合時,有些變化沒有被觀察到。往後注意級聯查詢時用左連線,能避免類似的錯誤出現。

資料庫中的表以行和列來組織資料每一行稱為什麼

access2003資料庫中的表以行和列來組織資料,每一行稱為一條記錄,每一列稱為乙個字段。我們把表中的每一行叫做乙個 記錄 每乙個記錄包含這行中的所有資訊,就像在通訊錄資料庫中某個人全部的資訊,但記錄在資料庫中並沒有專門的記錄名,常常用它所在的行數表示這是第幾個記錄。欄位是比記錄更小的單位,字段集...

資料庫多個session同時更新一行

資料庫多個session同時更新一行 資料庫多個session同時更新一行時,如果第一次的更新把where條件改變了,以後的更新操作還會成功嗎?測試 表中資料id 6 session a update test zwf set id 8 where id 6 先執行,不提交 session b up...

一行命令搞定AD資料庫備份

前面在 ad資料庫備份 為企業部署windows server 2008系列十五 一文中,說明了ad的常規備份方式,其實我們也可以使用命令列的方式來備份系統狀態,從而達到備份ad的目的。這裡解釋下系統狀態 systemstate 包含的檔案內容 在dc上 1 登錄檔 registry 2 com 類...