2009-07-01 19 views

Respuesta

228

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

+3

Si la clave principal siempre está indexada, ¿por qué las personas cuando hablan sobre la arquitectura/rendimiento de la base de datos siempre aconsejan a los recién llegados a SQL que "se aseguren de que su base de datos esté correctamente indexada"? –

+28

@tim: le dicen a las personas que se aseguren de que cualquier otra columna utilizada para filtrar, agrupar o ordenar también tenga índices. –

+11

¡No olvide unir también! Los campos de unión indexada aceleran las cosas. – JustJohn

8

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

10

La clave principal está indexada implícitamente para MyISAM e InnoDB. Puede verificar esto utilizando EXPLAIN en una consulta que hace uso de la clave principal.

29

Según http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html parecería que esto es sería implícita

+1

Encontré ese enlace buscando antes de hacer la pregunta. Pero no parece implicar eso ni nada más sobre esta pregunta para mí. –

+0

La página vinculada a en esta respuesta no parece decir nada acerca de si una clave principal también es un índice. Las páginas vinculadas en la [respuesta] (https://stackoverflow.com/a/13979135/245602) de @fyrye son más relevantes. –

12

pesar de que este se le pidió en 2009 pensé que había puesto una referencia real a la documentación de MySQL en las claves primarias. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

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

Para MySQL 5.0 Reference, véase: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

La mayoría de MySQL índices (PRIMARIA CLAVE, único, índice y FULLTEXT) son almacenados en B-trees. Las excepciones son que los índices en los tipos de datos espaciales usan árboles R, y que las tablas MEMORY también admiten índices hash.

6

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

Los índices se utilizan mejor en columnas que se utiliza con frecuencia en las cláusulas where, y en cualquier tipo de clasificación, tales 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 desea utilizarlas con cuidado en las columnas que se actualizan con FRECUENCIA.
  • Los índices aceleran donde las cláusulas y ordenan. Recuerde pensar 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 utilizar un índice que dejarlo fuera y simplemente dejarlo hacer una exploración de tabla.

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

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

  • ¡No te olvides de unir también! Los campos de unión indexada aceleran las cosas.

1

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

Por ejemplo, si ha creado una mesa 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; 

porque desea indexar la clave principal y hacer cumplir una restricción de unicidad en él, que le realidad terminan creando tres índices en foo!

Cuestiones relacionadas