mysql:2766
From: Satoshi Koiwa <Satoshi Koiwa <koiwa@xxxxxxxxxx>>
Date: Wed, 29 Nov 2000 22:33:22 +0900
Subject: [mysql 02766] Re: インデックスの効果について
頭痛の激しい小岩です。 > テーブル作成時に検索用インデックスを付けると 検索に対して、 > かなりの高速化が計れるのは分かるのですが、具体的に どういう > ケースで使用するのが もっとも効果的なのでしょうか? > また、項目内のデータに同一の情報が多く存在する場合と 全く > といって良い程、同一の情報が存在しない場合とでは 検索速度? > は変わってくるものなのでしょうか? > (データの長さは同一だと仮定して) > > みなさんは、どういう項目に対してインデックスを付けられています > か?。検索する頻度に関係なく 検索する可能性のある全ての項目 > に対してインデックスを付けられているのでしょうか? Oracleだとビットマップ索引があり、パーティション索引があり、クラスタだのハッ シュクラスタだのがあり、索引と表の物理的配置、もしあればそれぞれのクラスタの 物理的配置を設計してディスクI/Oを減らすだのI/O競合を避けるだのなんだのと管理 者/設計者の腕の見せ所なところがいろいろあるみたいですね。 そんなディスクアレイが何本もあるような環境でなくとも、同一Oracleブロック内や 同一エクステントに格納されていればどうのこうのとか、同値が5%以内であれば作っ てもいいとか、一応の基準が示されてもいます。 MySQLは全く別物なだけに、何も考えなくていいので楽だなぁという感じです。つま り「高速化したい時は何も考えずに関連の列にインデックスを張る」というだけ、と いう感じです。たとえ「あるだけ邪魔」な時にインデックスを張ったからといって劇 的に遅くなった経験はありません。 Classic Pentium 120MHz、128MBメモリでIDEディスクという環境で郵政省の郵便番号 データに対して試してみました。group byがインデックスの効果を見るのに最適では ないような気もしつつ。 ■ 2値の列 本来bitmap indexを張るべきな感じもする状況でgroup byで試してみますと「インデッ クスなんてあるだけ邪魔だ」状態で、こんなことになります。 mysql> select flag1, count(*) from ken_all group by flag1; +-------+----------+ | flag1 | count(*) | +-------+----------+ | 0 | 118426 | | 1 | 1736 | +-------+----------+ 2 rows in set (15.60 sec) mysql> create index ken_all_01 on ken_all(flag1); Query OK, 120162 rows affected (40.51 sec) Records: 120162 Duplicates: 0 Warnings: 0 mysql> select flag1, count(*) from ken_all group by flag1; +-------+----------+ | flag1 | count(*) | +-------+----------+ | 0 | 118426 | | 1 | 1736 | +-------+----------+ 2 rows in set (15.82 sec) mysql> ■ 47値の列 これに対して値が47個ある列に対してだと多少の効果が見られますが、劇的な改善に はなりません。 mysql> select ad1, count(*) from ken_all group by ad1; +----------+----------+ | ad1 | count(*) | +----------+----------+ | 愛知県 | 6769 | << 省略 >> | 和歌山県 | 1601 | +----------+----------+ 47 rows in set (18.84 sec) mysql> create index ken_all_02 on ken_all(ad1); Query OK, 120162 rows affected (1 min 3.30 sec) Records: 120162 Duplicates: 0 Warnings: 0 mysql> select ad1, count(*) from ken_all group by ad1; +----------+----------+ | ad1 | count(*) | +----------+----------+ | 愛知県 | 6769 | << 省略 >> | 和歌山県 | 1601 | +----------+----------+ 47 rows in set (17.97 sec) mysql>
2736 2000-11-26 14:07 ["Hiroshi Koishi" <pe] インデックスの効果について 2739 2000-11-27 19:00 ┣[inano <inano@xxxxxxx] 2740 2000-11-28 12:23 ┣[Yoshihiko Kobayashi ] -> 2766 2000-11-29 22:33 ┗[Satoshi Koiwa <koiwa] 2768 2000-11-30 00:43 ┗[とみたまさひろ <tomm] 2771 2000-11-30 09:34 ┣[Satoshi Tatsuoka <sa] 2772 2000-11-30 10:06 ┣["william" <william@x] 2775 2000-12-01 12:38 ┣[Satoshi Koiwa <koiwa] 2776 2000-12-01 13:50 ┗[Satoshi Koiwa <koiwa]