¿La clave principal se indexa automáticamente en MySQL?

243

¿Necesita crear explícitamente un índice o está implícito al definir la clave primaria? ¿La respuesta es la misma para MyISAM e InnoDB?

Alex Miller
fuente

Respuestas:

294

La clave primaria siempre está indexada. Esto es lo mismo para MyISAM e InnoDB, y generalmente es cierto para todos los motores de almacenamiento que admiten todos los índices.

Emil H
fuente
55
Si la clave primaria siempre está indexada, ¿por qué las personas cuando hablan de la arquitectura / rendimiento de la base de datos siempre aconsejan a los recién llegados de SQL que "se aseguren de que su base de datos esté indexada correctamente"?
Tim Peterson
35
@tim: Le dicen a las personas que se aseguren de que cualquier otra columna utilizada para filtrar, agrupar u ordenar también tenga índices.
Emil H
15
¡No olvides unirse también! Los campos de unión indexados aceleran las cosas.
JustJohn
31

De acuerdo con http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html , parecería que esto sería implícito

ist_lion
fuente
1
Encontré ese enlace buscando antes de hacer la pregunta. Pero no parece implicar eso ni nada más sobre esta pregunta para mí.
Alex Miller
La página vinculada a esta respuesta no parece decir nada sobre si una clave principal también es un índice. Las páginas enlazadas en la respuesta de @fyrye son más relevantes.
George Hawkins el
16

Aunque esto se preguntó en 2009, pensé que publicaría una referencia real a la documentación de MySQL en las claves principales. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

La clave principal de una tabla representa la columna o el conjunto de columnas que utiliza en sus consultas más importantes. Tiene un índice asociado, para un rendimiento rápido de la consulta.

Para obtener una referencia de MySQL 5.0, consulte: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

La mayoría de los índices MySQL ( PRIMARY KEY , UNIQUE, INDEX y FULLTEXT) se almacenan en B-trees. Las excepciones son que los índices en tipos de datos espaciales usan árboles R, y que las tablas de MEMORIA también admiten índices hash.

fyrye
fuente
11

La clave primaria está indexada implícitamente tanto para MyISAM como para InnoDB. Puede verificar esto utilizando EXPLAIN en una consulta que utiliza la clave primaria.

Patrick Gryciuk
fuente
9

No tiene que crear explícitamente un índice para una clave primaria ... se hace de manera predeterminada.

Almiar
fuente
8

Supongo que esta es la respuesta.

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)
invitado
fuente
7

Los índices se usan mejor en columnas que se usan con frecuencia en las cláusulas where, y en cualquier tipo de clasificación, como "ordenar por". Es posible que esté trabajando en una base de datos más compleja, por lo que es bueno recordar algunas reglas simples.

  • Los índices ralentizan las inserciones y actualizaciones, por lo que debe usarlas con cuidado en las columnas que se actualizan FRECUENTEMENTE.
  • Los índices se aceleran donde las cláusulas y se ordenan. Recuerde pensar en CÓMO se usarán sus datos al construir sus tablas. Hay algunas otras cosas para recordar. Si su tabla es muy pequeña, es decir, solo unos pocos empleados, es peor usar un índice que dejarlo fuera y dejarlo escanear una tabla.

  • Los índices realmente solo son útiles con tablas que tienen muchas filas.

  • Otra cosa para recordar, que es una estafa en la situación de la base de datos de nuestros empleados, es que si la columna tiene una longitud variable, los índices (así como la mayoría de MySQL) funcionan de manera mucho menos eficiente.

  • ¡No olvides unirse también! Los campos de unión indexados aceleran las cosas.

Masood Ul Hassan
fuente
4

La clave primaria siempre se indexa automáticamente y es única. Por lo tanto, tenga cuidado de no crear índices redundantes.

Por ejemplo, si creó una tabla como tal

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

como desea indexar la clave principal y aplicar una restricción de unicidad, ¡en realidad terminaría creando tres índices foo!

Dr_
fuente
0

Uno puede pensar en una columna de clave primaria como cualquier otra columna indexada con las restricciones de la clave primaria que trae consigo.

En la mayoría de los casos de uso, necesitamos tanto la clave primaria como la columna / columnas indexadas en una tabla, porque nuestras consultas a la tabla pueden filtrar filas en función de la columna / columnas que no es la clave principal, en ese caso generalmente indexamos esas columnas / columnas también.

Anshul Sharma
fuente