[前][次][番号順一覧][スレッド一覧]

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]