2016-04-01 18 views
5

Ad esempio disponiamo tabella:Due indici con lo stesso campo nella tabella MySQL

CREATE TABLE `my_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`id_type` int(11) NOT NULL, 
`date` date NOT NULL, 
`other_fields` varchar(200) CHARACTER SET latin1 NOT NULL, 
PRIMARY KEY (`id`), 
KEY `id_type` (`id_type`), 
KEY `type_date` (`id_type`,`date`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Ther sono due indici: id_type e id_type, data.

Come so se abbiamo indice con due campi, possiamo usarlo come indice singolo del primo campo.

Posso eliminare l'indice id_type senza perdere in prestazioni?

AGGIORNAMENTO: Questa domanda fa notare che a volte lo stesso campo in indici diversi ha cardinalità diversa.

+0

sì, è possibile eliminarlo. –

risposta

2

MySQL 5.7.9 - L'eliminazione di id_type indice non fa la differenza. L'indice multi colonna (type_date) viene applicato per entrambe le query.

Spiegare uscita query:

mysql> explain SELECT id_type,date FROM my_tbl WHERE id_type='some'; 
+----+-------------+--------+------------+------+---------------+-----------+---------+-------+------+----------+-------------+ 
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref | rows | filtered | Extra  | 
+----+-------------+--------+------------+------+---------------+-----------+---------+-------+------+----------+-------------+ 
| 1 | SIMPLE  | my_tbl | NULL  | ref | type_date  | type_date | 4  | const | 1 | 100.00 | Using index | 
+----+-------------+--------+------------+------+---------------+-----------+----- 



mysql> explain SELECT id_type FROM my_tbl WHERE id_type='some'; 
+----+-------------+--------+------------+------+---------------+-----------+---------+-------+------+----------+-------------+ 
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref | rows | filtered | Extra  | 
     +----+-------------+--------+------------+------+---------------+-----------+---------+-------+------+----------+-------------+ 
| 1 | SIMPLE  | my_tbl | NULL  | ref | type_date  | type_date | 4  | const | 1 | 100.00 | Using index | 
     +----+-------------+--------+------------+------+---------------+--------- 


mysql> show indexes from my_tbl; 
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| my_tbl |   0 | PRIMARY |   1 | id   | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
| my_tbl |   1 | type_date |   1 | id_type  | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
| my_tbl |   1 | type_date |   2 | date  | A   |   0 |  NULL | NULL |  | BTREE  |   |    | 
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+------------- 
+0

Questo è interessante. Puoi provare a eseguire le stesse query, aggiungendo solo l'indice di una singola colonna e pubblicando i risultati? – Starx

+0

@Starx: lo stesso indice "tipo_date" viene applicato anche quando sono presenti sia gli indici a colonna singola che a più colonne – Sanj

1

INDEX(a), INDEX(a, b) - Cada il primo, in quanto quest'ultimo può essere utilizzato.

Avere entrambi lo spazio su disco e rallentare gli inserti (un po ').

INDEX(a, c), INDEX(a, d) - Potresti trovare che entrambi siano utili.

UNIQUE(a), INDEX(a, b) - Ora, a causa del vincolo di unicità, è necessario il primo. Lascia cadere quest'ultimo.

D'altra parte ... INDEX(a, b) (in 2 dei miei esempi) potrebbe essere particolarmente utile se si trattasse di un indice di "copertura". Cioè, se il SELECT toccato siaa e b e non altre colonne. In tal caso, la query viene eseguita interamente nella struttura dell'indice (BTree) e non deve toccare la struttura dei dati.

More info.

Problemi correlati