2014-03-12 32 views
0

我正在研究文字遊戲,爲此目的,我有一個數據庫表,其中包含約20000個英文單詞,長度介於2到5個字母之間。表結構很簡單:如何在MySQL中優化搜索字典數據庫

id | word | length 
1 | stuff | 5 
2 | ask | 3 

所以字長有自己的專欄,我不知道這可能是有用的,但它的存在現在。

遊戲的原理涉及用戶輸入5個字母(口述給他),並試圖儘可能完成一個單詞。例如,假設他有字母A,C,F,R,T,他必須鍵入全部5.因此,他可以將單詞CRAFT拼起來。或者,如果他沒有找出那一個,他可以看到這個詞RAFT。如果他沒有看到,也許他會看到ART。但是 - 在這種情況下,他不能只輸入3或4個字母,他必須輸入全部5個(因爲與遊戲其餘部分有關的原因,並且與此無關)。所以它必須是像ARTFCCFART。現在,這個問題。

應用程序(PHP或Node.js)必須在MySQL數據庫中搜索用戶可能在字符串中鍵入的所有單詞。首先它應該搜索5個字母的單詞,然後如果它沒有找到任何它應該搜索4個字母的單詞(如果用戶鍵入ARTFC它應該搜索ARTFRTFC),可能會出現在5個字符的字符串中。如果它沒有發現,3個字母的單詞等

這似乎可能會有點慢。用戶最多可以同時提交10個這樣的5個字符的字符串,並且用戶數量很難預測。那麼,任何人都可以提出一個更好的方法來執行這個搜索,而不是分割字符串併發送連續查詢,直到我們找到一個單詞爲止?

作爲一個子問題,你認爲InnoDB會比MyISAM更好的選擇引擎嗎?數據庫表的唯一目的是這個搜索,沒有必要寫入它。

回答

0

我會堅持使用MyISAM mysql引擎用於讀取密集型任務。 至於表格設計以獲得更好的表現,您可以使用分區和SUBPARTITION創建字母。
做我的意思是說什麼:

  • 你會得到最大的26個字母 - 這意味着你將有26個分區
  • 各該分區將有4 SUBPARTITION

    • 一個2字母詞
    • 一個3字母詞
    • 一個4字母詞
    • 一個5個字母的單詞

畢竟這是做增加你的查詢緩存大小看link如何