こんにちは、ユーザーが入力した文字列を取り、文字が実際の単語を構成しているかどうかを確認するスクラブルのようなゲームを作成する作業を探していました。およそ 100 万エントリのすべての英単語のリストがあると仮定すると、たとえば「zoo」が存在するかどうかを確認するには長い時間がかかりますか? 時間がかかる場合、このようなゲームはどうなりますか?
この質問は、php と MySQL を使用していることを前提としています。
単語列にインデックスがある場合、単語を含む100万エントリが遅くなることはありません。これは、単語がかなり短いが、キーを活用するのに十分なエントロピー(統計的分散)があるためです。
これが100万フレーズの場合、フレーズの比較には少し時間がかかる可能性があります。最適化するために、フレーズを最初の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秒で、各選択の10分の1ミリ秒を意味します。
PHPからクロックを供給したという事実を考慮に入れてください。これは、実際のSQL実行速度がはるかに速いことを意味します。93.5秒には、PHPがTPCを介してMySQLと通信することが含まれます。
テーブルにさらに900万の値を挿入し、1,000万の値に対して100万のselectステートメントを実行する同じスクリプトをテストしました。全体の所要時間は約52秒です。
次のような単語をクエリできますselect ( COUNT(*) or whatever field you like,i.e word) from yourtable where word = 'user_inputted string'
また、その列にもインデックスを付ける必要があります。これにより、クエリが高速に実行されます。
1 つの主キー「単語」を持つ単語のデータベース テーブルがあれば、100 万のエントリがあっても、それほど時間はかからないはずです...
SELECT COUNT(*) FROM words WHERE word = 'zoo'
// returns 1 or 0