インデックスが対象とするカラムの名前を調べる
はいはい、お次はこれ。
まーにょ!
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って出るのね。