1. 程式人生 > >mysql優化之資料庫隨機取一條資料

mysql優化之資料庫隨機取一條資料

大家都知道mysql 查詢資料庫隨機取一條資料當然用rand()方法 

其實這個方法是超級雞肋的,當然你愛好也無所謂,首先列舉兩個表

a表   id(主鍵 int),cardnumber(身份證號碼 char(18)),name(使用者名稱 varchar(40))

b表   id(a表對應id int), tags(標籤 varchar(11)),tagsnumber(標籤編碼,varchar(24))


現在打比方這a表有一萬表資料 ,對應的b表有1萬+資料

不要在乎表這裡只是舉例

現在查詢a表隨機一個使用者

1:select * from a order by rand() limit 1(肯定初步大家剛出來的都會想到這個方法)

可是這樣靠譜嗎,反正我覺得不靠譜  上面說了一萬條資料怎麼也得接近20秒吧返回一條資料

首先說說rand()他是把表資料首先整個取出來,排序,就算你limit有用嗎

2:select * from a limit 5    

在程式碼隨機取出一條

這種也不是怎麼好,

3:我看別人說max和min結合用,反正我覺得不靠譜,反正我嘗試了一下基本也差不多要5秒左右,查詢複雜一點,對於那種一條sql幾乎有20幾行的那真是要你瘋癲起來


4:結合程式+order by

首先數字欄位+索引來實現

$orderby=array('order by id asc','order by id desc','order by cardnumber asc','order by cardnumber desc');

$sql="select * from a ".$orderby[array_rand($orderby,1)]. " limit 1 ";


雖然不能完全隨機,但是還是滿足日常需求

說道這個其實也可以討論一下order by效能丟失,有時候你會發現沒用order by和用了order by居然效能丟失,當然我說的是沒有索引欄位的情況下

例如假設上面表是一對一的關係 獲取使用者下面一個標籤

select b.*,a.* from b inner join b on a.id=b.id order by a.uid asc limit 1

你會發現如果是b.uid會快一點,所以當你order by哪一個的時候建議返回欄位的時候放在前面