隨機獲取資料庫表記錄行

2021-06-28 07:39:02 字數 1459 閱讀 8069

1、隨機排序後獲取第一行

獲取隨機記錄的常見sql做法,就是對查詢結果進行隨機排序,然後獲取第一行。如:select * from bugs order by rand() limit 1;

這種方法在資料據量非常小的時候,效能不會有什麼大的影響。如果資料量非常龐大時,這將是致命的(因為你需要遍歷整個表進行排序)。如果採用隨機函式的返回值進行排序,則排序就跟記錄本身沒有任何關係,則每次排序後的資料是不一樣的,這樣資料的排序就不能被復用。使用隨機函式排序,則不能使用資料庫的索引進行排序,索引排序是非常快的。不使用索引排序的後果就是不得不遍歷整張表(這是非常慢的)。隨機排序的另乙個問題就是,好不容易對整個資料進行了排序,但是只用了一條資料,太浪費了。

2、在**id最大和最小值之間選擇乙個隨機數

通過資料庫或者程式中的隨機函式,生成乙個指定表id最小值到最大值之間的隨機數。然後將顯示這個隨機數指定的記錄。如下:

select b1.* from bugs as b1 join (select ceil(rand()*(select max(bug_id) from bugs)) as rand_id) as b2 on (b1.bug_id = b2.rand_id);

注意:要求主鍵值必須從1開始到最大值,且是連續的。如果漏掉了某些值,則可能獲取不到資料(缺點)。如bugs表:

bug_id(bug編號) name(bug名稱)

1 bugname01

2 bugname02

4 bugname04

6 bugname06

隨機獲取bugs表中的一條記錄:

select ceil(rand()*(select max(bug_id) from bugs));

有rand() * 6 ==>,如果rand()=0.9,則0.9*6=5.4,向下取整後等於5,從上面的表中可以看出bug_id=5的記錄不存在。

3、隨機找到的下乙個有效值

與上面的方案類似,但解決了表中在最小值和最大值之間存在縫隙的情況,這個查詢會返回它隨機找到的第乙個有效的值。如下:

select b1.* from bugs as b1 join (select ceil(rand()*(select max(bug_id) from bugs)) as rand_id) as b2 where b1.bug_id>=b2.bug_id order by b1.bug_id limit 1;

這個方法解決了沒有隨機數對應的主鍵值,即方法2的問題。但是在縫隙後面的第一列的選中機率會隨著縫隙的增大而增大。如下:

bug_id(bug編號) name(bug名稱)

1 bugname01

2 bugname02

100 bugname001

在上面這章表中隨機數字位於3到100之間的都將選中bug_id=100的這條記錄,那麼bug_id=100這條記錄的選中概率將非常高。

注意:當表中資料向id值之間的縫隙不大並且每個值要被等概率選中的重要性不高時可以考慮這種方案

MySQL資料庫 表 記錄操作

建立表之前先選擇資料庫 use 某個資料庫 建立表 語法 create table 表名 欄位名 型別 長度 約束,欄位名 型別 長度 約束,欄位名 型別 長度 約束 表的檢視 檢視資料庫中有哪些表 show tables 檢視表結構 desc 表名 表的刪除 表的刪除 drop table 表名 ...

查詢資料庫表記錄數

select table name,table rows from information schema.tables order by table rows desc limit 20 個別表的資料太大了,這才執行半年多吧,這樣下去不知道資料庫會不會有問題 大致看了下資料,發現模擬量上傳的資料一分...

資料庫管理表記錄基本操作

1 增加表記錄 格式 1 給所有字段賦值 insert into 表名values 字段 1 值 字段 n 值 第 1 條表記錄 字段 1 值 字段 n 值 第 2 條表記錄 字段 1 值 字段 n 值 第 3 條表記錄 exp mysql insert into usertab values 43...