2012-06-17 58 views
1

在我的jsp應用程序中,我有一個搜索框讓用戶在數據庫中搜索用戶名。我在每次擊鍵時發送ajax調用,並從輸入的字符串開始獲取5個隨機名。 我正在使用以下查詢: select userid,name,pic from tbl_mst_users where name like 'queryStr%' order by rand() limit 5 但是,這是非常慢,因爲我有超過2000個記錄在我的表中。快速mysql查詢隨機選擇N個用戶名

有沒有更好的方法,需要更少的時間,讓我實現相同..?我需要隨機值。

+0

你的標題應該是快速的MySQL查詢隨機選擇不同的用戶名代替正因爲n是5這裏 – 2012-06-17 05:05:24

回答

1

如何慢是 「非常緩慢」,在幾秒鐘?

您的查詢速度較慢的原因很可能是您沒有在name上放置索引。 2000行對於MySQL來說應該是小菜一碟。

另一個可能的原因是您在SELECT子句中有很多列。在這種情況下,我假設在排序這個大的結果集之前,MySQL引擎首先將所有這些數據複製到臨時表中。

我勸下面,讓您在使用索引只工作,只要可能:

SELECT userid, name, pic 
FROM tbl_mst_users 
JOIN (
    -- here, MySQL works on indexes only 
    SELECT userid 
    FROM tbl_mst_users 
    WHERE name LIKE 'queryStr%' 
    ORDER BY RAND() LIMIT 5 
) AS sub USING(userid); -- join other columns only after picking the rows in the sub-query. 

這種方法是有點好轉,但仍不能很好地擴展。然而,小桌子應該足夠了(2000排確實很小)。

link provided by @user1461434很有意思。它描述了一個性能幾乎不變的解決方案。唯一的缺點是它一次只返回一個隨機行。

+0

我沒有指數上我的專欄,你指出。我會索引它,並再次檢查性能。由於 – Muthukrishnan

+0

@Muthukrishnan你找到一個解決問題了嗎?如果是這樣,請將一個答案標爲正確。 – RandomSeed

1
  1. 確表名稱索引? 如果不應用它

2.MediaWiki使用一個有趣的把戲(維基百科的特殊:隨機功能):與物品表中有一個隨機數(在創建文章時產生),一個額外的列。要獲得一篇隨機文章,請生成一個隨機數,並獲取隨機數字列中的下一個較大或較小(不記得哪個)值的文章。有了索引,這可以非常快。 (並且MediaWiki是用PHP編寫的並且是爲MySQL開發的。)

如果生成的數字分佈不均勻,此方法可能會導致問題; IIRC,這個問題已經在MediaWiki上解決了,所以如果你決定這樣做的話,你應該看看代碼,看看它是如何完成的(可能他們週期性地重新生成隨機數字列)。

3.http://jan.kneschke.de/projects/mysql/order-by-rand/