2015-01-13 209 views
3

我有一個MySQL數據庫(InnoDB)與表usersusername列。在Ruby on Rails網站上,我有一項功能可以讓用戶通過用戶名搜索某人。輸入時,網站會建議用戶正在搜索的用戶(鍵入w/bootstrap)。目前我在MySQL中使用查詢,SELECT `username` FROM users WHERE `username` LIKE 'the_query%' LIMIT 15;快速字符串匹配MySQL查詢

存在的問題是速度。該表大約有500,000行,並且類似的查詢似乎需要大約秒,這在生成猜測時太慢。我能做些什麼來提高性能? 100毫秒以下的東西將是合適的。也許有比使用MySQL來處理搜索更好的方法嗎?

回答

0

最終加入了一個FULLTEXT索引作爲Keshan提到的用戶名列(以前只有一個唯一的索引),這似乎將速度提高了10倍。查詢大約需要90到120毫秒。

0
  • 在您的用戶表中創建索引以獲得快速結果(這真的有助於更快地給出結果 )。
  • 確保用戶在鍵入某個字符後(不僅在 單個字符搜索後)獲得結果。
+0

我沒有提到我在用戶名列上創建了一個索引。我想允許單個字符搜索,但該檢查可能會有所幫助。謝謝! – IvyCode

0

如果你從username字符串的開頭專門搜索,對串匹配可能會更快:SELECT `username` FROM users WHERE SUBSTRING(`username`, 0, CHAR_LENGTH('the_query'))='the_query';

+0

我給它一個鏡頭,但它似乎產生相同的速度。另外,我將該查詢更正爲「SUBSTRING('username',1,CHAR_LENGTH ...''。感謝您的幫助! – IvyCode

+0

在這種情況下,我與用戶達成一致:索引將是最簡單的我沒有太多的經驗,但是[FULLTEXT索引](http://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html)會有幫助嗎?否則,您可能需要創建一個新的索引列,其中包含第一個字符的ASCII碼,並首先使用該條件進行搜索? – concat

0

儘量限制你匹配的數量。如果它是搜索欄,則無法在搜索列表中顯示數千條記錄。但從上面的查詢中,服務器發送所有結果到前端,我猜。然後你可以從中過濾記錄。除此之外,請嘗試此查詢。

限制記錄到10號......

選擇username來自用戶的WHERE username LIKE 'the_query%' LIMIT 10;

+0

糟糕,忘記提及我將其限制爲15個。將其降至5,查詢仍需要〜 1秒。 – IvyCode

+0

嘗試使用全文搜索... –

+1

SELECT username FROM users WHERE MATCH(username)AGAINST('the_query') –

0

如果您從用戶名+密碼創建md5散列,它會更快。由於每行的長度都是32個字符,因此您可以在此字段上設置索引,並在索引字段上使用非常快的搜索。