2

您好,我正在寻找一些工作来创建一些像拼字游戏这样的游戏,它将获取用户输入的字符串并检查字母是否构成一个真实的单词。假设您有一个包含所有英语单词的列表,大约有一百万个条目,是否需要很长时间来检查“zoo”是否存在?如果需要很长时间,这样的游戏会做什么?

这个问题假设您使用的是 php 和 MySQL。

4

3 回答 3

0

如果您有一个带有 1 个主键“单词”的单词数据库表,那么即使您有一百万个条目也不应该花很长时间......

SELECT COUNT(*) FROM words WHERE word = 'zoo'
// returns 1 or 0
于 2012-05-24T08:20:50.777 回答
0

你可以查询像select ( COUNT(*) or whatever field you like,i.e word) from yourtable where word = 'user_inputted string'

而且您还必须索引该列,这样您的查询将运行得很快。

于 2012-05-24T08:24:56.953 回答
0

如果您在 word 列上有索引,则包含单词的 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 次测试,平均为93.478111839294秒,对于 100 万条选择语句,意味着每个选择的十分之一毫秒。

考虑到我是用 PHP 计时的,这意味着实际的 SQL 执行速度要高得多,93.5 秒包括 PHP 通过 TPC 与 MySQL 通信。

我在表中插入了额外的 900 万个值,并针对 1000 万个值测试了运行 100 万个选择语句的相同脚本。总时长约为 52 秒。

于 2012-05-24T08:40:01.877 回答