AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 216125
Accepted
Jon of All Trades
Jon of All Trades
Asked: 2018-08-29 13:59:01 +0800 CST2018-08-29 13:59:01 +0800 CST 2018-08-29 13:59:01 +0800 CST

Pode-se fazer o cluster MySQL em um índice exclusivo em vez de uma chave primária?

  • 772

A documentação do MySQL afirma que:

Quando você define uma PRIMARY KEY em sua tabela, o InnoDB a usa como o índice clusterizado.

Mas essa não é a única possibilidade, você pode agrupar um índice exclusivo:

Se você não definir uma PRIMARY KEY para sua tabela, o MySQL localiza o primeiro índice UNIQUE onde todas as colunas de chave são NOT NULL e o InnoDB o usa como o índice clusterizado.

Parece que se eu primeiro criar um índice exclusivo em uma tabela, ele será marcado como clusterizado; Posso então criar uma chave primária e ela não será agrupada:

CREATE TABLE Tmp_CUQTest
(
ID1 INT NOT NULL,  -- Desired clustering field
ID2 INT NOT NULL   -- Desired PK field
);

CREATE UNIQUE INDEX CUC_Tmp ON Tmp_CUQTest (ID1);
ALTER TABLE Tmp_CUQTest ADD CONSTRAINT PRIMARY KEY PK_Tmp (ID2);

No entanto, quando inspeciono a tabela resultante, minhas esperanças são frustradas:

Key      Type               Uni  Columns
PRIMARY  BTREE (clustered)  YES  ID2
ID1      BTREE              YES  ID1

Outra pergunta aqui no DBA.SE implica que criar um índice como parte do CREATE TABLEscript, e não depois, como uma CREATE INDEXdeclaração separada, pode fazer a diferença. No entanto, recebo o mesmo resultado.

Existe uma maneira de forçar o MySQL a agrupar em um índice exclusivo de minha escolha, que não seja a chave primária, ou essa "opção de fallback" se aplica apenas a tabelas sem chave primária?

mysql mysql-5.7
  • 2 2 respostas
  • 2040 Views

2 respostas

  • Voted
  1. Best Answer
    Rick James
    2018-10-01T09:34:58+08:002018-10-01T09:34:58+08:00

    PRIMARY KEY

    • O InnoDB tem exatamente um PRIMARY KEYem cada tabela.
    • O PRIMARY KEYé sempre agrupado; não pode haver nenhum outro índice "agrupado".
    • Esse PK é um PK explicitamente declarado (é preferível), a primeira UNIQUEchave (com certas limitações) ou um número de sequência oculto (não exatamente o mesmo que `AUTO_INCREMENT; 6 bytes).
    • O PK é UNIQUE e é e index.
    • O PK (e outros índices) pode conter várias colunas (índice "composto".
    • A tabela é estruturada como um BTree (na verdade, um B+Tree), com todas as colunas presentes, e o BTree é ordenado de acordo com o PK.

    Chaves secundárias

    • Todos os outros índices são chamados de "índices secundários". ("chave" == "índice")
    • A estrutura é uma B+Tree, ordenada de acordo com a chave
    • As "linhas" deste BTree contêm cópias da(s) coluna(s) do PRIMARY KEY(ou seja, o 'índice clusterizado'). É assim que a chave secundária pode chegar à linha.
    • Observe que procurar uma linha por meio de uma chave secundária requer o detalhamento de dois BTrees. (A menos que seja um índice de "cobertura").
    • A UNIQUE KEYé duas coisas: uma chave secundária (a menos que seja promovida a PK) e uma "restrição de exclusividade".

    Outras notas

    • O InnoDB não tem o conceito de "ROWNUM" ou "localizador de linha", ao contrário de alguns outros fornecedores. O PK serve como localizador de linha.
    • O MySQL não possui índices "Heap" ou "Bit" no InnoDB.
    • O InnoDB possui apenas BTree, SPATIAL e FULLTEXT; Não estou discutindo os dois últimos nesta resposta.
    • Para a maioria dos propósitos, não importa se você cria os índices dentro da CREATE TABLEinstrução ou faz CREATE INDEXmais tarde. Idem para definir FOREIGN KEYs.
    • Estruturalmente, os dados PK+ são uma árvore B+; cada índice secundário é um B+Tree. Estas B+Trees parecem, sentem, cheiram, etc, idênticas. A única diferença é o que você encontra nas 'linhas'.

    AUTO_INCREMENT

    • Há muitas ressalvas. Não são necessariamente números consecutivos; há muitas maneiras pelas quais as lacunas podem ocorrer. Apenas confie que eles serão 'únicos'.
    • AUTO_INCREMENTnão precisa ser declarado PRIMARY KEY, ou mesmo UNIQUE.

    Um truque . É possível fazer o seguinte. É isso que você está pescando??

    CREATE TABLE ... (
      id INT AUTO_INCREMENT,
      foo ...,
      ...
      PRIMARY KEY (foo, id),  -- to get clustering on `foo` and uniqueness (via `id`)
      INDEX(id)               -- sufficient to keep AUTO_INCREMENT happy.
    ) ENGINE=InnoDB;
    
    • 2
  2. danblack
    2018-08-29T14:11:28+08:002018-08-29T14:11:28+08:00

    Uma chave primária é uma chave exclusiva e um índice. Portanto, crie o PK como o índice exclusivo no qual você deseja agrupar.

    Criar adicionando um índice posteriormente e como parte da tabela de criação produz o mesmo resultado.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve