你好我正在尋找一些工作來創建一些像拼字遊戲一樣的遊戲,它將採取用戶輸入的字符串,並檢查這些字母是否構成一個真正的單詞。假設你有一個所有英文單詞的列表,大約一百萬條目,是否需要很長時間才能檢查「動物園」是否存在?如果這需要很長時間,這樣的遊戲會做什麼?查詢檢查word是否存在php MySQL?例如:像拼字遊戲
這個問題假設你使用php和MySQL。
你好我正在尋找一些工作來創建一些像拼字遊戲一樣的遊戲,它將採取用戶輸入的字符串,並檢查這些字母是否構成一個真正的單詞。假設你有一個所有英文單詞的列表,大約一百萬條目,是否需要很長時間才能檢查「動物園」是否存在?如果這需要很長時間,這樣的遊戲會做什麼?查詢檢查word是否存在php MySQL?例如:像拼字遊戲
這個問題假設你使用php和MySQL。
如果你有話的數據庫表1的主鍵「字」,那麼它不應該採取長期在所有,即使你有一萬個條目...
SELECT COUNT(*) FROM words WHERE word = 'zoo'
// returns 1 or 0
你可以查詢單詞一樣select (COUNT(*) or whatever field you like,i.e word) from yourtable where word = 'user_inputted string'
並且您還必須對該列進行索引,這樣您的查詢將運行得更快。
如果您在單詞列上有索引,則包含單詞的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秒。
不要爲此使用'LIKE'。你會想要一個完全匹配。你不希望用戶輸入'o'並找到'動物園'(和其他數百萬字)。你希望他們放入'動物園'並找到'動物園',只有'動物園'。 – Okonomiyaki3000
瞭解它,編輯答案, – jugnu