RDBで文字列に対する効果的なインデックスの張り方

  • 投稿日:
  • カテゴリ:

RDBで文字列にインデックスをそのまま張ってる事って結構あると思います。
(普通はないかな?)

例えばURLに対してINDEXを作った場合、1エントリに対してのインデックスの量が多くなってしまいます。
そこでカラムを一つ追加して、その文字列のハッシュ値を格納するようにします。
そして文字列のカラムにはインデックスを張りません。
WHERE句を書くときには、「ハッシュ値カラム AND 文字列カラム」とします。
これでインデックスツリーが小さくなってDBサーバのメモリ効率が上がります。
クライアントサイドでハッシュを求めることになりますが、クライアントサイドはスケール化が簡単な事と、ハッシュ値計算なんて微々たるものなので問題にはならないと思います。

Javaの場合であればhashCode()メソッドがあるので自前でハッシュ関数を作る必要はありません。

MySQLを例にしてみます。
(直接手打ちしたので構文エラーになるかもしれませんw)

-- これは悪い例
CREATE TABLE TBL_URL(
  IDX INTEGER NOT NULL,
  URL VARCHAR(4096) NOT NULL,
  STATUS INTEGER NOT NULL,
  TITLE VARCHAR(1024),
  BODY MEDIUMTEXT,
  PRCDATE TIMESTAMP NOT NULL,
  CONSTRAINT PK_TBL_URL PRIMARY KEY (IDX)
);
CREATE INDEX IDX_TBL_URL_01 ON TBL_URL(URL(255));
-- SELECT * FROM TBL_URL WHERE URL = ?
-- 改善例
CREATE TABLE TBL_URL(
  IDX INTEGER NOT NULL,
  URLCD INTEGR NOT NULL,
  URL VARCHAR(4096) NOT NULL,
  STATUS INTEGER NOT NULL,
  TITLE VARCHAR(1024),
  BODY MEDIUMTEXT,
  PRCDATE TIMESTAMP NOT NULL,
  CONSTRAINT PK_TBL_URL PRIMARY KEY (IDX)
);
CREATE INDEX IDX_TBL_URL_01 ON TBL_URL(URLCD);
-- SELECT * FROM TBL_URL WHERE URLCD = ? AND URL = ?
新しいサイトもよろしくお願いします!