ユーザーが指定したURLを含むテーブルを作成しています。それらを一意にしたいので、ユーザーがURLを提供すると、まずURLが存在するかどうかを確認し、存在する場合はエントリのIDを返します。そうでない場合は、このURLで新しい行を作成します。
明らかに私はこれを速くしたい。最良の選択肢は何ですか?
私は間違いなくURLのハッシュを使い、ハッシュを一意のインデックスにします。ハッシュは固定長であるため、CHAR
を使用して列の長さを指定できます。これにより、VARCHAR
またはTEXT
よりもパフォーマンスがわずかに向上します。
しかし、データベースを2回呼び出す代わりに _INSERT IGNORE
_ を使用することをお勧めしますか?何かのようなもの:
_INSERT IGNORE INTO urlTable VALUES ('urlHash');
_
これには、最初にSELECT COUNT(*)
クエリを実行しなくても、重複するハッシュを挿入しようとすると発生する可能性のある重複エラーを無視できるという利点があります。
何か足りない場合を除き、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`)
);