使用庞大的数据库和哈希索引优化php / mysql翻译查找

时间:2013-04-05 08:13:49

标签: mysql hash translation

我目前正在使用utf8 mysql数据库。它检查翻译是否已经存在于数据库中,如果没有,则进行翻译并将其存储在数据库中。

SELECT * FROM `translations` WHERE `input_text`=? AND `input_lang`=? AND `output_lang`=?;

(另一个字段是“output_text”。)对于基本数据库,它将首先逐字母地将输入文本与“input_text”“TEXT”字段进行比较。只要字符匹配,它就会不断比较它们。如果他们停止匹配,它将进入下一行。

我不知道数据库是如何在低级别工作的,但我认为对于基本数据库,它会在确定输入文本不在数据库之前从数据库中的每一行搜索至少一个字符。数据库中。

理想情况下,输入文本将被转换为哈希码(例如,使用sha1),并且每个“input_text”也将是哈希。然后,如果数据库正确排序,它可以快速找到与哈希匹配的所有行,然后检查实际文本。如果没有匹配的哈希值,那么即使没有手动检查每一行,也不会返回任何结果。

是否有一种类型的mysql存储引擎可以做这样的事情,还是有一些额外的PHP可以优化的东西?应该将“input_text”设置为某种“索引”吗? (PRIMARY / UNIQUE / INDEX / FULLTEXT)

是否有一种与php兼容的替代类型的数据库远远优于mysql?

编辑: 这是关于MySQL的B-Tree vs Hash索引:

http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

哈希索引的限制对我来说都不是问题。它还说

它们仅用于使用=或< =>的等式比较。运营商(但非常快)

[“非常”被他们用斜体显示]

新问题:

如何将“input_text”TEXT设置为哈希索引? BTW多行包含相同的“input_text”...是否适合哈希索引?

http://dev.mysql.com/doc/refman/5.5/en/column-indexes.html

表示“MEMORY存储引擎默认使用HASH索引” - 这是否意味着我只需更改存储引擎并将列索引设置为INDEX?

2 个答案:

答案 0 :(得分:0)

正常的INDEX子句应该足够了(确保索引所有字段,它在磁盘上会很大,但速度更快)。当您使用FULLTEXT子句时,LIKE索引很好; - )

无论如何,对于那种查找,你应该使用像Redis这样的NoSQL存储,它速度非常快,并且有一个内存存储,并且还可以通过快照进行数据持久化。

这里有一个扩展名为:https://github.com/nicolasff/phpredis

你将拥有以下形式的redis密钥:YOUR_PROJECT:INPUT_LANG:WORD:OUTPUT_LANG用于更好的数据管理,只需用你的值替换每个值,你就可以了;)

答案 1 :(得分:0)

索引会加速查找速度。

默认情况下,InnoDB和MyISAM中的索引使用搜索树(B树)。索引行的长度有一个限制,因此您只需索引1-700~700字节的文本。

CREATE INDEX txt_lookup ON translations (input_lang, output_lang, input_text(255));

这将在input_langoutput_langinput_text的第1个255个字符上创建索引。

当您使用示例查询进行选择时,MySQL将使用索引查找具有相应语言的行,并快速找到相同的起始255个字符,然后它将执行慢速字符串与小集上的列的全长比较它从索引获得的行。