2017-01-31 12 views
2

インデックスが期待通りに作成されない理由を理解しようとしています。私は、既存の外部キーの上にHASHインデックスを作成したときに何が起こったのかを調べていました。MySQL: `SHOW INDEX`は` SHOW CREATE TABLE`とは違って表示されます

create table users (id int, primary key(id)); 
create table temp (id int not null, primary key(id), user_id int(11) default null); 

現在のところ、外部キーはありません。あなたが期待するものshow create table temp;出力:

| temp | CREATE TABLE `temp` (
    `id` int(11) NOT NULL, 
    `user_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 

そしてshow index from temp

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| temp |   0 | PRIMARY |   1 | id   | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 

すべてが良いです。

alter table temp add foreign key key_name (user_id) references users (id); 

これは、私たちshow create table temp;を示しています:

| temp | CREATE TABLE `temp` (
    `id` int(11) NOT NULL, 
    `user_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `key_name` (`user_id`), 
    CONSTRAINT `temp_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 

show index from temp;

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| temp |   0 | PRIMARY |   1 | id   | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
| temp |   1 | key_name |   1 | user_id  | A   |   0 |  NULL | NULL | YES | BTREE  |   |    | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 

これまでのところは良い:我々は外部キー制約を追加したとMySQLが自動的に追加今すぐFKを追加することができます制約を適用するために使用するBTREEインデックス

私はそれを追加しているので、今、私はそのインデックスをHASHになりたい:それは奇妙なのはここになり

create index index_name using hash on temp (user_id); 

です。期待どおりshow create table tempを行うときは、KEY (...) USING HASHエントリを参照することができます:

| temp | CREATE TABLE `temp` (
    `id` int(11) NOT NULL, 
    `user_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `index_name` (`user_id`) USING HASH, 
    CONSTRAINT `temp_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 

しかし、あなたが変更show index from temp;

+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| temp |   0 | PRIMARY |   1 | id   | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
| temp |   1 | index_name |   1 | user_id  | A   |   0 |  NULL | NULL | YES | BTREE  |   |    | 
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 

何もしないとき!インデックスはまだBTREEです!

ここでは何が起こっていますか?

EDIT:誰かが私の注意を喚起したかもしれません。create index ...はどういうわけかalter table add index ...と同じではありません。さて、私はそれを試して、彼らは確かに同じことをやっている。 alter table temp add index (user_id) using hashはInnoDBストレージエンジンだけBTREEインデックス、ないHASHインデックスをサポートし

| temp | CREATE TABLE `temp` (
    `id` int(11) NOT NULL, 
    `user_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `index_name` (`user_id`) USING HASH, 
    KEY `user_id` (`user_id`) USING HASH, 
    CONSTRAINT `temp_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 



+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| temp |   0 | PRIMARY |   1 | id   | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
| temp |   1 | index_name |   1 | user_id  | A   |   0 |  NULL | NULL | YES | BTREE  |   |    | 
| temp |   1 | user_id |   1 | user_id  | A   |   0 |  NULL | NULL | YES | BTREE  |   |    | 
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
+0

InnoDBエンジンとMyISAMエンジンは 'hash'インデックス型を許可していないので、彼らは静かに' btree'というものを使用します。ハッシュインデックスタイプを強制する理由はありますか? – Mjh

答えて

3

につながります。

HASHインデックスを作成しようとすると、インデックスが暗黙のうちにBTREEに変換されました。

関連する問題