搜索一个庞大的数据库

时间:2012-04-07 01:18:40

标签: php mysql performance

我遇到了一些问题atm,也就是说,我有一些单词的数据库,就像900,000,我想要做的是,检查一个单词是否在其中,如果是,则返回另一个字段这一行。

当我这样做时,我得到了时间。我知道我可以改变超时,但我真正想要的是如果可能的话以某种方式使它更快。我的访客不想等待30多秒才能得到他想要的东西。

我无法制作900,000k静态文件,因为我在托管中有inode限制。

所以我几乎被锁定了,所以我能做些什么才能让它变得更好?

表格结构:

ID |字| Otherword

CREATE TABLE `database` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `word` text COLLATE utf8_unicode_ci NOT NULL,
 `md5string` text COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=966277 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

查询:

mysql_query("SELECT otherword FROM table WHERE word='$word'");

另一个问题:

mysql_query("SELECT word FROM table WHERE otherword='$otherword'");

主查询(使用GET的文件)

$word = $_GET["word"];
echo $word;
$check = mysql_query("SELECT md5string FROM `database` WHERE word='$word'") or     die(mysql_error());
while (mysql_num_rows($check)>0)
{
$out = mysql_fetch_array($check);
$output = $out[0];
}

4 个答案:

答案 0 :(得分:2)

如果搜索更多,则添加fulltex index并使用MyIsam表。 否则,根据要求添加索引。

答案 1 :(得分:1)

如果您拥有合理的索引,那么在MySQL数据库中搜索超过100万行应该不是问题。

尝试在数据库中添加一个索引,如下所示(假设您要查找的单词位于其自己的列中):

ALTER TABLE your_word_table ADD KEY(word_column(32));

(编辑为包括密钥长度,因为事实证明它们是TEXT列)

答案 2 :(得分:1)

100万不应该是30秒。你能告诉我们你的查询和表结构吗? 尝试对字段使用全文显示。 尝试使用大写单词定义搜索行,只搜索大写等等。

ALTER TABLE  `database` ADD FULLTEXT (
 `word` , `md5string` );

答案 3 :(得分:1)

这应该会在完成后快速查找。更新以包括要索引的列的数量,因为这些是文本字段。

ALTER TABLE`database`ADD INDEX word_idx(word(32)),ADD INDEX md5_idx(md5string(32))

您是否将表命名为“数据库”?这是MySQL中的一个保留字,可能会引起一些麻烦......