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