systemadmin.es > DBA > Las foreign keys implican un índice

Las foreign keys implican un índice

En las bases de datos, no nos interesa tener índices duplicados para evitar el coste extra que implica actualizarlos (además del espacio en disco). Por eso, deberemos tener en cuenta que si creamos una foreign key, estamos también creando un índice sobre dicha columna y por lo tanto, no es necesario crear otro índice:

Podemos verlo mediante las siguientes dos tablas, t2 tiene una foreign key sobre el segundo campo:

mysql> create table t1(id int primary key);
Query OK, 0 rows affected (0.08 sec)

mysql> create table t2 (id int primary key, id2 int, constraint k foreign key (id2) references t1(id));
Query OK, 0 rows affected (0.06 sec)

Insertamos unos datos de ejemplo:

mysql> insert into t1 values (1),(2);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql>  insert into t2 values (1,1),(2,1),(3,1),(4,2);
Query OK, 4 rows affected (0.03 sec)
Records: 4  Duplicates: 0  Warnings: 0

Si ahora hacemos un explain a una query sobre el campo que tienen la foreign key de la segunda tabla:

mysql> explain select * from t2 where id2=1;
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra                    |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | t2    | ref  | k             | k    | 5       | const |    3 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)

Haciendo un SHOW CREATE TABLE podremos ver el índice y la foreign key:

mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int(11) NOT NULL,
  `id2` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `k` (`id2`),
  CONSTRAINT `k` FOREIGN KEY (`id2`) REFERENCES `t1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>