2012-05-24 36 views
2

你好我正在尋找一些工作來創建一些像拼字遊戲一樣的遊戲,它將採取用戶輸入的字符串,並檢查這些字母是否構成一個真正的單詞。假設你有一個所有英文單詞的列表,大約一百萬條目,是否需要很長時間才能檢查「動物園」是否存在?如果這需要很長時間,這樣的遊戲會做什麼?查詢檢查word是否存在php MySQL?例如:像拼字遊戲

這個問題假設你使用php和MySQL。

回答

0

如果你有話的數據庫表1的主鍵「字」,那麼它不應該採取長期在所有,即使你有一萬個條目...

SELECT COUNT(*) FROM words WHERE word = 'zoo' 
// returns 1 or 0 
0

你可以查詢單詞一樣select (COUNT(*) or whatever field you like,i.e word) from yourtable where word = 'user_inputted string'

並且您還必須對該列進行索引,這樣您的查詢將運行得更快。

+0

不要爲此使用'LIKE'。你會想要一個完全匹配。你不希望用戶輸入'o'並找到'動物園'(和其他數百萬字)。你希望他們放入'動物園'並找到'動物園',只有'動物園'。 – Okonomiyaki3000

+0

瞭解它,編輯答案, – jugnu

0

如果您在單詞列上有索引,則包含單詞的1百萬個條目不應該太慢。這是因爲這個詞很短,但是具有足夠的熵(統計分散)來利用密鑰。

如果這是一百萬個短語,比較這些短語可能需要更長的時間,爲了優化,您可以將短語分解爲前3個單詞(不同列)和其餘列4列索引在他們的短語。

測試這樣的速度:

set_time_limit(60*60); 
$pdo = new PDO('mysql:host=localhost;dbname=db', 'user', 'pass'); 

$x = microtime(TRUE); 
for($i = 0; $i < 1000000; $i++) { 
    $word = ''; 
    for($j = 0; $j < mt_rand(0,40); $j++) { 
     $word .= chr(97+mt_rand(0,25)); 
    } 
    if($_GET['select']) 
     $pdo->query("SELECT FROM words WHERE word = '$word';"); 
    else if($_GET['insert']) 
     $pdo->exec("INSERT IGNORE INTO words (word) VALUES ('$word');"); 
} 
$x = microtime(TRUE)-$x; 
var_dump($x); 

CREATE TABLE IF NOT EXISTS `words` (
    `word` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, 
    UNIQUE KEY `word` (`word`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

我主頻在我的筆記本電腦的速度最初80.765522003174秒,我已經做了10次測試,平均是100萬的select語句周圍93.478111839294秒,意思是每個選擇的十分之一毫秒。

考慮到我從PHP計時的事實,這意味着實際的SQL執行速度要高得多,93.5秒包括PHP通過TPC與MySQL進行通信。

我已經向表中插入了額外的900萬個值,並測試了運行100萬個選擇語句的同一個腳本對1000萬個值。整體持續時間大約爲52秒。