web-dev-qa-db-ja.com

MySQL:一意のURLの保存

ユーザーが指定したURLを含むテーブルを作成しています。それらを一意にしたいので、ユーザーがURLを提供すると、まずURLが存在するかどうかを確認し、存在する場合はエントリのIDを返します。そうでない場合は、このURLで新しい行を作成します。

明らかに私はこれを速くしたい。最良の選択肢は何ですか?

  • 実際のURLを一意のvarcharにして、このURLで確認しますか?
  • URLのハッシュを作成し、それをソートの主キーとして使用しますか?
  • 他のアイデア?
6
nute

私は間違いなくURLのハッシュを使い、ハッシュを一意のインデックスにします。ハッシュは固定長であるため、CHARを使用して列の長さを指定できます。これにより、VARCHARまたはTEXTよりもパフォーマンスがわずかに向上します。

しかし、データベースを2回呼び出す代わりに _INSERT IGNORE_ を使用することをお勧めしますか?何かのようなもの:

_INSERT IGNORE INTO urlTable VALUES ('urlHash');
_

これには、最初にSELECT COUNT(*)クエリを実行しなくても、重複するハッシュを挿入しようとすると発生する可能性のある重複エラーを無視できるという利点があります。

7
Derek Downey

何か足りない場合を除き、HASH型のUNIQUEインデックスを作成するだけです。独自のハッシュとトリガーを追加するとどうなるかわかりませんか?そして、フィールド自体がNOT NULLである。

CREATE  TABLE `test`.`bla` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `text` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `text_UNIQUE` USING HASH (`text`)
);
2
Jannes