從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 類...