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


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

Author: ElliotSchmelliot, 2009-07-02

8 answers

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 índices.

 248
Author: Emil H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-03 20:41:23
 29
Author: PSU_Kardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-01 20:25:27

A pesar de que esto se preguntó en 2009, pensé en publicar 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

La clave primaria para una tabla representa la columna o conjunto de columnas que utilizas en tus consultas más vitales. Tiene un índice asociado, para un rendimiento de consulta rápido

Para la referencia de MySQL 5.0 ver: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

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

 12
Author: fyrye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-02 21:21:34

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

 10
Author: Patrick Gryciuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-01 20:25:05

No es necesario crear explícitamente un índice para una clave primaria... se hace por defecto.

 8
Author: Rick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-13 07:36:26

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)
 6
Author: guest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-28 07:41:05

Los índices se utilizan mejor en columnas que se utilizan con frecuencia en cláusulas where, y en cualquier tipo de ordenación, como "order by". 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 los insertos y las actualizaciones, por lo que debe usarlos cuidadosamente en columnas que se actualizan CON frecuencia.
  • Los índices aceleran las cláusulas where y ordenan por. Recuerde pensar en CÓMO se utilizarán sus datos al crear su tabla. Hay algunas otras cosas que recordar. Si su mesa es muy pequeña, es decir, solo unos pocos empleados, es peor usar un índice que dejarlo fuera y dejar que haga un escaneo de la mesa.

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

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

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

 3
Author: Masood Ul Hassan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 10:58:38

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

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

Debido a que desea indexar la clave primaria y aplicar una restricción de unicidad en ella, en realidad terminaría creando tres índices en foo!

 1
Author: dr01,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-25 15:09:17