2009-06-17 10 views
13

MySqlに大量のURLを格納し、列にユニークなインデックスを作成したいとします。列をutf8にするとvarchar(333)に制限されますが、これは自分のURLの一部を保持するには不十分です。私がlatin1であると宣言した場合、私は1000文字全部を取得します(それほど必要とは思わない)。ただし、URLをエンコードして、常にエンコードされたURLを操作する必要があります。大量のURLを管理する良い方法はありますか?URLをMySQLに保存する最も効率的な方法は?

答えて

5

URLのホスト名とプロトコル部分を別々のテーブルに格納し、キーを使用して参照することが考えられます。これは後で、特定のホストのすべてのURLを取得し、文字列の長さに関する懸念を助けるためにも役立ちます。例えば

:これを行うには

PROTOCOLS 
----------------------- 
PROTOCOL_ID INTEGER 
PROTOCOL  VARCHAR(10) (i.e., http, https, ftp, etc.) 

HOSTS 
----------------------- 
id  BIGINT 
hostname varchar(256) 

URL 
----------------------- 
PROTOCOL  INTEGER FK to PROTOCOLS 
HOSTNAME  BIGINT FK to HOSTS 
QUERY_STRING VARCHAR(333) 
+0

クエリ文字列の中には、http://www.foo.com/index.jsp?a = 1&b = 2&c = 3 ..................... ..........................&z = uuuuggggghhhh –

+0

合意。あなたは、テキストフィールドを使用するlongneckの提案のルートを行くことがあります。私は「URLの大規模なセットを管理するより良い方法はありますか?HOSTSテーブルにDOMAINテーブルに戻るdomain_keyを持つホスト名とドメインに分割することで、URLをどのように使用しているかに応じてやりたいことがあります。これにより、ドメイン内のすべてのURLを簡単に見つけることができます。 –

+0

URLは非常に長くなる可能性があります - http://www.boutell.com/newfaq/misc/urllength.html – cjroth

0

私が知っている最も一般的なプラクティスは、衝突制御付きのハッシュアルゴリズムを使用しています。ちょっとしたクイック・ワンウェイ・エンコーディングを使用すると、URLの衝突が非常に少なくなります。

すべてのURL(つまりHTTP://、wwwなど)で同じ部分が細かくなるように切り取ってみてください。URLがすべてドメインの一部である場合は、それも切り捨ててください。

それ以外の場合は、問題を再検討し、達成しようとしていることを達成するための別の方法を試してみてください。私は、URLのユニークなセットが本当に他のいくつかの問題を解決していると仮定します。

+2

なぜ彼がURLを保存しているのかについて間違った前提があるでしょう。 wwwなどを切り落とすのはおそらく/そうでない/安全です。 –

+0

例を挙げてください。 httpとwwwを削除すると元のURLを簡単に再生成できますが、定義の整合性には影響しません...これを説明できますか? –

+5

それは間違っています。 http://www.foo.comとhttp://foo.comが同じURLを参照する保証はありません。 https://www.foo.comとhttp://foo.comだけでは許さない。 –

9

3良い方法:

1)の代わりにVARCHARのテキストを使用します。一意性を保証するために、MD5()またはSHA1()ハッシュを格納し、UNIQUEまたはPRIMARYインデックスを追加するために別個のVARCHAR列を作成する必要があります。これはURLを取得する追加のディスクシークの不幸な結果をもたらしますが、ユースケースによってはOKかもしれません。

2)バイナリ照合でVARCHARを使用し、COMPRESS()を使用してURLを圧縮します。

3)最初の2文字を入力していたときに3番目の文字を忘れてしまった。 grr ...

+1

+1、私は個人的に#1(URLのハッシュにユニークな制約を置きます。自体)。 – nathan

+0

したがって、VARCHAR URL列をプライマリとして設定するのではなく、ハッシュの別の列を作成する必要がありますか? – User

+0

私は2つの別々の提案をしました。私は、誰かが他よりも優れているとは言いませんでした。ユースケースに最も適したものを選択する必要があります。 – longneck

関連する問題