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 / 63652
Accepted
BenMorel
BenMorel
Asked: 2014-04-23 07:31:19 +0800 CST2014-04-23 07:31:19 +0800 CST 2014-04-23 07:31:19 +0800 CST

Eficiência da chave primária do InnoDB

  • 772

Eu li vários artigos sobre eficiência de chaves primárias, dependendo do mecanismo de armazenamento, e estou confuso.

Dada uma tabela muitos-para-muitos simples com dois campos storeIde zoneId, qual dos seguintes designs é o mais eficiente com o InnoDB e por quê?

  • usando os dois campos como uma chave primária composta:
CREATE TABLE store_zone(
    storeId INT(10) UNSIGNED NOT NULL,
    zoneId  INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY(storeId, zoneId)
);
  • Usando uma chave primária específica de incremento automático:
CREATE TABLE store_zone(
    id      INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    storeId INT(10) UNSIGNED NOT NULL,
    zoneId  INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY(id),
    UNIQUE KEY(storeId, zoneId)
);

Notas:

  • Eu preciso de uma chave única no par ( storeId, ) de qualquer maneirazoneId
  • Eu tenho chaves estrangeiras para as tabelas storee zone, não mostradas aqui para facilitar a leitura , portanto, em ambos os casos, há um índice extra necessário zoneIdtambém
mysql innodb
  • 1 1 respostas
  • 1493 Views

1 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2014-04-23T08:18:23+08:002014-04-23T08:18:23+08:00

    Análise

    Já que estamos falando do InnoDB, vamos nos concentrar no gen_clust_index. É um índice especial que mantém a PRIMARY KEY e os dados de linha associados acessíveis nas mesmas páginas do InnoDB.

    De acordo com a documentação do MySQL no gen_clust_index

    • Se você definir uma PRIMARY KEY em sua tabela, o InnoDB a usará como o índice clusterizado.

    • Se você não definir uma PRIMARY KEY para sua tabela, o MySQL escolhe o primeiro índice UNIQUE que possui apenas colunas NOT NULL como chave primária e o InnoDB o usa como índice clusterizado.

    • Se a tabela não tiver PRIMARY KEY ou índice UNIQUE adequado, o InnoDB gera internamente um índice clusterizado oculto em uma coluna sintética contendo valores de ID de linha. As linhas são ordenadas pelo ID que o InnoDB atribui às linhas dessa tabela. O ID da linha é um campo de 6 bytes que aumenta monotonicamente à medida que novas linhas são inseridas. Assim, as linhas ordenadas pelo ID da linha estão fisicamente na ordem de inserção.

    Sendo assim, você realmente sentiria eficiência ou deficiência nas seguintes áreas:

    Espaço em disco

    Ter a única coluna auto_increment como PRIMARY KEYmantém o tamanho geral da PRIMARY KEY menor do que ter duas colunas. Por quê? As páginas BTREE seriam duas vezes maiores se PRIMARY KEYfossem dois INTs em vez de um. Isso se torna ainda mais doloroso se você usar restrições de chave estrangeira e índices secundários, pois eles devem aumentar de tamanho também.

    Nesse caso, você escolheria o segundo esquema para melhor uso do índice.

    Inserir desempenho

    Inserir dados de linha em uma tabela InnoDB que possui dois índices UNIQUE exige o dobro de gerenciamento de BTREE e verificações exclusivas.

    • Um para o gen_clust_index (ditado por auto_increment)
    • Um para o outro índice UNIQUE (ditado por (storeId, zoneId))

    Microssegundos adicionais para cada índice UNIQUE adicional seriam somados no tempo de CPU ao inserir milhões de linhas.

    Nesse caso, você escolheria o primeiro esquema para INSERTs mais rápidos.

    Conclusão

    O espaço em disco e os problemas de desempenho de inserção praticamente o forçam a escolher. Obviamente, você escolhe com qual viver. Se você usar restrições de chave estrangeira que representam (storeId, zoneId), precisará do segundo esquema usando o auto_increment como referência em tabelas externas.

    • 5

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