我目前正在使用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“设置为某种”索引“?(主要/唯一/索引/全文)
是否有一种与php兼容的、比mysql优越得多的替代数据库类型?
编辑:本文讨论了用于MySQL的B树与散列索引:
http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
哈希索引的所有限制对我来说都不是问题。它还说
它们仅用于使用=或<=>运算符(但非常快)的相等比较。
他们用斜体表示“非常”。
新问题:
如何将"input_text“文本设置为散列索引?顺便说一下,多行包含相同的"input_text"..。哈希索引可以吗?
http://dev.mysql.com/doc/refman/5.5/en/column-indexes.html
“内存存储引擎默认使用散列索引”--这是否意味着我只需要更改存储引擎并将列索引设置为索引?
发布于 2013-04-05 08:28:51
一个普通的INDEX子句应该足够了(请确保对所有字段进行索引,它在磁盘上会很大,但速度更快)。当使用FULLTEXT子句时,LIKE索引是很好的;-)
无论如何,对于这种查找,您应该使用NoSQL存储,比如Redis,它速度惊人,有内存存储,还可以通过快照进行数据持久化。
这里有一个php的扩展:https://github.com/nicolasff/phpredis
您将拥有以下形式的redis键:YOUR_PROJECT:INPUT_LANG:WORD:OUTPUT_LANG用于更好的数据管理,只需将每个值替换为您的值即可;)
发布于 2013-04-05 08:34:01
索引将大大加快查找速度。
默认情况下,InnoDB和MyISAM中的索引使用搜索树(B-树)。索引行的长度是有限制的,所以您必须只对1 ~700字节的文本进行索引。
CREATE INDEX txt_lookup ON translations (input_lang, output_lang, input_text(255));
这将在input_lang、output_lang和input_text的1-st 255个字符上创建索引.
当您选择“使用示例查询”时,MySQL将使用索引快速查找具有适当语言和相同开头255个字符的行,然后将慢速字符串与它从索引获得的小行集上的列的完整长度进行比较。
https://stackoverflow.com/questions/15828969
复制相似问题