A chave primária é indexada automaticamente no MySQL?

243

Você precisa criar explicitamente um índice ou está implícito ao definir a chave primária? A resposta é a mesma para o MyISAM e o InnoDB?

Alex Miller
fonte

Respostas:

294

A chave primária é sempre indexada. É o mesmo para MyISAM e InnoDB e geralmente é válido para todos os mecanismos de armazenamento que suportam índices.

Emil H
fonte
5
Se a chave primária é sempre indexada, por que as pessoas quando falam sobre arquitetura / desempenho do banco de dados sempre aconselham os recém-chegados ao SQL a "garantir que o banco de dados esteja indexado corretamente"?
tim Peterson
35
@tim: eles estão dizendo às pessoas para garantir que outras colunas usadas para filtrar, agrupar ou classificar também tenham índices.
Emil H
15
Não se esqueça de participar também! Os campos de junção indexados aceleram as coisas.
JustJohn
31

De acordo com http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html , parece que isso está implícito

ist_lion
fonte
1
Encontrei esse link pesquisando antes de fazer a pergunta. Mas isso não parece implicar isso ou qualquer outra coisa muito sobre esta questão para mim.
Alex Miller
A página vinculada a esta resposta não parece dizer nada sobre se uma chave primária também é um índice. As páginas vinculadas na resposta de @fyrye são mais relevantes.
George Hawkins
16

Mesmo que isso tenha sido solicitado em 2009, achei que eu postaria uma referência real à documentação do MySQL sobre chaves primárias. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

A chave primária de uma tabela representa a coluna ou o conjunto de colunas que você usa em suas consultas mais importantes. Possui um índice associado, para desempenho rápido da consulta

Para referência ao MySQL 5.0, consulte: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

A maioria dos índices MySQL ( PRIMARY KEY , UNIQUE, INDEX e FULLTEXT) são armazenados em árvores B. As exceções são que os índices nos tipos de dados espaciais usam árvores R e que as tabelas MEMORY também suportam índices de hash.

fyrye
fonte
11

A chave primária é indexada implicitamente para o MyISAM e o InnoDB. Você pode verificar isso usando EXPLAIN em uma consulta que faz uso da chave primária.

Patrick Gryciuk
fonte
9

Você não precisa criar explicitamente um índice para uma chave primária ... isso é feito por padrão.

Rick
fonte
8

Eu acho que essa é a resposta

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)
convidado
fonte
7

Os índices são mais usados ​​em colunas que são freqüentemente usadas nas cláusulas where e em qualquer tipo de classificação, como "classificar por". Você pode estar trabalhando em um banco de dados mais complexo, por isso é bom lembrar de algumas regras simples.

  • Os índices abrandam as inserções e atualizações, portanto, você deve usá-las com cuidado em colunas atualizadas com FREQUÊNCIA.
  • Os índices aceleram as cláusulas where e ordenam por. Lembre-se de pensar em COMO seus dados serão usados ​​ao criar suas tabelas. Existem algumas outras coisas para lembrar. Se sua tabela é muito pequena, ou seja, apenas alguns funcionários, é pior usar um índice do que deixá-lo de fora e deixá-lo fazer uma varredura de tabela.

  • Os índices realmente são úteis apenas com tabelas com muitas linhas.

  • Outra coisa a lembrar, que é um golpe na situação do banco de dados de nossos funcionários, é que, se a coluna tiver um comprimento variável, os índices (assim como a maior parte do MySQL) terão um desempenho muito menos eficiente.

  • Não se esqueça de participar também! Os campos de junção indexados aceleram as coisas.

Masood Ul Hassan
fonte
4

A chave primária é sempre indexada e exclusiva automaticamente. Portanto, tome cuidado para não criar índices redundantes.

Por exemplo, se você criou uma tabela 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 você deseja indexar a chave primária e impor uma restrição de exclusividade nela, na verdade, você acaba criando três índices foo!

dr_
fonte
0

Pode-se pensar em uma coluna de chave primária como qualquer outra coluna indexada com as restrições da chave primária.

Na maioria dos casos de uso, precisamos de chave primária e coluna / colunas indexadas em uma tabela, porque nossas consultas à tabela podem filtrar linhas com base em colunas / colunas que não são chave primária; nesse caso, geralmente indexamos essas colunas / colunas também.

Anshul Sharma
fonte