インデックスが対象とするカラムの名前を調べる

はいはい、お次はこれ。

まーにょ!

      uint nkey_parts = key.key_parts;
      KEY_PART_INFO key_part;
      int j = 0;
      for (; j < nkey_parts; j++) {
        key_part = key.key_part[j];
        uint16 fieldnr = key_part.fieldnr;
        Field *field;
        field = table->field[fieldnr-1];
        const char *field_name = field->field_name;
        printf("indexed field's name is %s\n", field_name);
      }

できた。KEY_PART_INFO.fieldnrは0スタートではなく1スタートなので、配列インデックスとして使う場合には-1する必要あり。

CREATE TABLE `t1` (
  `c1` int(11) NOT NULL,
  `c2` int(11) default NULL,
  `c3` int(11) default NULL,
  PRIMARY KEY  (`c1`),
  UNIQUE KEY `idx1` USING HASH (`c2`),
  KEY `idx2` (`c2`,`c3`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

こんなテーブルの場合、、

table alias is t1
number 0 key's type is BTREE
name = PRIMARY, key_length = 4, key_parts = 1, algorithm = 0
indexed field's name is c1
number 1 key's type is BTREE
name = idx1, key_length = 5, key_parts = 1, algorithm = 3
indexed field's name is c2
number 2 key's type is BTREE
name = idx2, key_length = 10, key_parts = 2, algorithm = 0
indexed field's name is c2
indexed field's name is c3

こんな感じで情報がとれます。

!!そう、気づいてしまったんですが、ha_myisam::index_typeが、algorithm=3のときに"BTREE"って返してます!!

ここはHASHって返して欲しい所。

覗いてみると、、、

const char *ha_myisam::index_type(uint key_number)
{
  return ((table->key_info[key_number].flags & HA_FULLTEXT) ?
          "FULLTEXT" :
          (table->key_info[key_number].flags & HA_SPATIAL) ?
          "SPATIAL" :
          (table->key_info[key_number].algorithm == HA_KEY_ALG_RTREE) ?
          "RTREE" :
          "BTREE");
}

HASHが華麗にスルーされてますなw

あれ?MyISAMってHASH型インデックスはサポートしてなかったんだっけ? SHOW INDEXしてもBTREEと表示されるわけだが、そういう仕様だっけ?

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

そういう仕様だったw frmファイルは"ALTER TABLE"を考慮しているので、SHOW CREATEだとHASHって出るのね。