データベースは,大量のデータを格納して目的に合わせて処理するのが役割である。処理を高速化する機能として,インデックスが用意されている。インデックスは,あらかじめ検索やソート対象となる列のデータを処理しやすいように別管理するものだ。インデックスを使いこなせるかどうかで,データベース処理の良し悪し決まるといっても過言ではない。しかし,インデックスいつまでも高速ではない。その効果が,色褪せる時がやってくるのだ。

インデックスの効用

 まずは,肩慣らしにインデックスの効用を確認する。テーブル「pono」は,日本郵政グループの日本郵便事業株式会社が提供している郵便番号データを格納したテーブルだ。

図1●テスト用のテーブル「pono」
mysql> show create table pono \G
*************************** 1. row ***************************
Table: pono
Create Table: CREATE TABLE `pono` (
`id` int(11) default NULL,
`no` int(11) NOT NULL auto_increment,
`po1` char(5) default NULL,
`po2` char(5) default NULL,
`po` char(7) default NULL,
`kana1` varchar(50) default NULL,
`kana2` varchar(50) default NULL,
`kana3` varchar(50) default NULL,
`adr1` varchar(20) default NULL,
`adr2` varchar(50) default NULL,
`adr3` varchar(50) default NULL,
KEY `no` (`no`)
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp932
1 row in set (0.00 sec)

 日本郵便事業株式会社は,全国の郵便番号と対応する住所をCSVデータで格納している。122114件の漢字を含むデータなので,テストデータとして便利だ。もちろん,実際のシステムでもアドレス入力処理などでお世話になる。ここでは,必要な列のみを読み込み,識別用に2つのフィールド「id」「no」を追加している。

 試しにインデックスがない状態で,郵便番号150-0002を検索する。検索までの時間は,0.42 secである。

図2●インデックスがない状態の検索結果
mysql> select * from pono where po = '1500002' \G
*************************** 1. row ***************************
   id: 38859
   no: 71753
  po1: 13113
  po2: 150
   po: 1500002
kana1: トウキョウト
kana2: シブヤク
kana3: シブヤ
 adr1: 東京都
 adr2: 渋谷区
 adr3: 渋谷
1 row in set (0.42 sec)