0

現在、utf8 mysql データベースを使用しています。翻訳がデータベースに既に存在するかどうかを確認し、存在しない場合は翻訳を実行してデータベースに保存します。

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

(もう 1 つのフィールドは「output_text」です。) 基本的なデータベースの場合、最初に入力テキストを「input_text」「TEXT」フィールドと 1 文字ずつ比較します。文字が一致している限り、それらを比較し続けます。それらが一致しなくなると、次の行に進みます。

データベースが低レベルでどのように機能するかはわかりませんが、基本的なデータベースの場合、入力テキストがデータベースにないと判断する前に、データベースのすべての行から少なくとも 1 文字を検索すると思います。

理想的には、入力テキストはハッシュ コードに変換され (たとえば、sha1 を使用)、各 "input_text" もハッシュになります。次に、データベースが適切にソートされていれば、ハッシュに一致するすべての行をすばやく見つけて、実際のテキストをチェックできます。一致するハッシュがない場合、各行が手動でチェックされていなくても、結果は返されません。

このようなことを行うことができる mysql ストレージ エンジンのタイプはありますか、それとも物事を最適化できる追加の php はありますか? 「input_text」をある種の「インデックス」に設定する必要がありますか? (プライマリ/ユニーク/インデックス/フルテキスト)

mysql よりもはるかに優れた、php と互換性のある別のタイプのデータベースはありますか?

編集: これは、MySQL の B-Tree とハッシュ インデックスについて話します:

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

ハッシュ インデックスの制限はどれも私にとって問題ではありません。それはまた言います

これらは、= または <=> 演算子を使用する等価比較にのみ使用されます (ただし、非常に高速です) 。

[「非常に」は彼らによってイタリック体にされた]

新しい質問:

"input_text" TEXT をハッシュ インデックスに設定するにはどうすればよいですか? ところで、複数の行に同じ「input_text」が含まれています...ハッシュインデックスには問題ありませんか?

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

「MEMORY ストレージ エンジンはデフォルトで HASH インデックスを使用します」とありますが、これは、ストレージ エンジンを変更して、列のインデックスを INDEX に設定する必要があるということですか?

4

2 に答える 2

0

通常のINDEX句で十分です (必ずすべてのフィールドにインデックスを付けてください。ディスク上では大きくなりますが、高速になります)。FULLTEXT句を使用している場合、インデックスは適切ですLIKE;-)

とにかく、その種のルックアップには、Redisのような NoSQL ストアを使用する必要があります。これは非常に高速で、インメモリ ストアがあり、スナップショットによるデータの永続化も行います。

ここにphpの拡張機能があります:https://github.com/nicolasff/phpredis

そして、次の形式で redis キーを取得します:YOUR_PROJECT:INPUT_LANG:WORD:OUTPUT_LANGより良いデータ管理のために、各値を自分の値に置き換えるだけで準備完了です ;)

于 2013-04-05T08:28:51.000 に答える