2017-01-31 4 views
2

Ich versuche zu verstehen, warum ein Index nicht so erstellt wird, wie ich es erwartet hatte. Ich habe gerade untersucht, was passiert ist, als ich einen HASH-Index auf einem vorhandenen Fremdschlüssel erstellt habe.MySQL: `SHOW INDEX` zeigt anders als` 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); 

Momentan gibt es noch keinen Fremdschlüssel. show create table temp; gibt, was man erwarten würde:

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

Und 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  |   |    | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 

Alles ist gut. Jetzt lässt einen FK hinzufügen:

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

Dies zeigt uns 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 | 

und 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  |   |    | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 

So weit so gut: Wir haben einen Fremdschlüssel hinzugefügt und MySQL automatisch hinzugefügt ein BTREE-Index, mit dem die Einschränkung erzwungen wird.

Nun möchte ich diesen Index gerne einen HASH sein, damit ich es bin und fügte hinzu:

create index index_name using hash on temp (user_id); 

Hier ist, wo es seltsam wird. Sie können die KEY (...) USING HASH Eintrag sehen, wenn Sie show create table temp tun wie erwartet:

| 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 | 

Allerdings, wenn Sie 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  |   |    | 
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 

nichts geändert zu tun! Und der Index ist immer noch ein BTREE !.

Was geht hier vor?

EDIT: jemand rief zu meiner Aufmerksamkeit, dass vielleicht create index ... ist nicht das gleiche wie alter table add index ... irgendwie. Nun, ich habe es versucht, und sie machen das gleiche. alter table temp add index (user_id) using hash führt zu

| 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

Problem ist ziemlich trivial - InnoDB und MyISAM-Engines erlauben nicht den 'hash' -Indextyp, so dass sie stillschweigend auf den von ihnen verwendeten zurückgreifen, der' btree' ist. Gibt es einen Grund, warum Sie den Hash-Indextyp durchsetzen? – Mjh

Antwort

3

Die InnoDB-Speicher-Engine unterstützt nur BTREE Indizes, nicht HASH Indizes.

Wenn Sie versucht haben, einen HASH Index zu erstellen, wurde der Index automatisch in BTREE konvertiert.