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 / 341720
Accepted
ERFANIUM
ERFANIUM
Asked: 2024-08-17 06:42:25 +0800 CST2024-08-17 06:42:25 +0800 CST 2024-08-17 06:42:25 +0800 CST

Chave primária única vs. chave primária composta para armazenar dados isolados do usuário

  • 772

Digamos que eu queira armazenar os dados fornecidos pelo usuário em uma tabela chamada post.

  • os dados dos usuários são isolados por user_idcoluna
  • select sum(likes_count) where user_id = $deveria ser rápido
  • select * from post where id = $deveria ser rápido

Você poderia ajudar a comparar esses esquemas em termos de desempenho, indexação e casos de uso típicos?

nota: os valores char(24) são a string hexadecimal ObjectId do MongoDB. eles são exclusivos no banco de dados.

Esquema 1:

usando PRIMARY KEY (id)e índice secundário em(user_id)

CREATE TABLE posts_v1 (
  id CHAR(24) NOT NULL,
  user_id CHAR(24) NOT NULL,
  likes_count INT,
  PRIMARY KEY (id),
  KEY 'user_id_idx' (user_id)
);

usando PRIMARY KEY (user_id, id)e índice exclusivo secundário em(id)

Esquema 2:

CREATE TABLE posts_v2 (
  id CHAR(24) NOT NULL,
  user_id CHAR(24) NOT NULL,
  likes_count INT,
  PRIMARY KEY (user_id, id),
  UNIQUE KEY 'id_idx' (id)
);

Questões:

1- Em quais cenários um esquema teria desempenho melhor que o outro? Por exemplo, consultas que filtram por user_id, id ou ambos.

2- posts_v2O esquema usa menos leituras de página do InnoDB ao consultar por user_id? Presumo que, no caso de posts_v2, a tabela esteja fisicamente agrupada por user_id, para que possamos recuperar todas as postagens dos usuários com menos varreduras de página. Minha suposição é verdadeira?

3- Integridade e manutenção de dados: Há alguma implicação para integridade de dados, manutenção ou evolução futura de esquema com qualquer design?

4- Casos de uso: Quais são os casos de uso ou cargas de trabalho típicos que podem favorecer um design em detrimento de outro?

Agradeço quaisquer insights ou recomendações que você possa fornecer!

mysql
  • 2 2 respostas
  • 47 Views

2 respostas

  • Voted
  1. White Owl
    2024-08-17T07:44:06+08:002024-08-17T07:44:06+08:00

    Começando pela pergunta nº 3 – Integridade dos dados: Não, esses dois esquemas não são iguais. Na verdade, elas são tão diferentes que outras questões não são realmente relevantes.

    A tabela com PK ativado idteria valor único no idcampo:

    insert into posts_v1 (id, user_id) values(1, 'john')
    insert into posts_v1 (id, user_id) values(2, 'john')
    insert into posts_v1 (id, user_id) values(2, 'mary') -- error
    

    Mas a tabela com PK ativada user_id,idpode ter valores duplicados no idcampo:

    insert into posts_v2 (id, user_id) values(1, 'john')
    insert into posts_v2 (id, user_id) values(2, 'john')
    insert into posts_v2 (id, user_id) values(2, 'mary') -- not an error
    

    Mas se você quiser comparar o PK de campo único com um PK de vários campos: o PK de campo único geralmente tem melhor desempenho. Há exceções, é claro, mas são raros os casos em que o multicampo tem melhor desempenho.

    A resposta mais prática para o seu problema seria: primeiro, decida o que é um natural keyno seu caso, é um campo múltiplo ou pode ser um campo único? Busque o que é melhor do ponto de vista comercial, não do desempenho. Depois disso, você pode adicionar um secundário unique indexno outro campo (ou campos). Dessa forma, você obterá cobertura para ambos os tipos de consultas - por um ou vários campos, independentemente de fazerem parte do PK ou do índice.

    • 1
  2. Best Answer
    Rick James
    2024-08-18T02:56:14+08:002024-08-18T02:56:14+08:00

    O esquema 2 é bom para essas consultas .

    • PRIMARY KEY (user_id, id)é a chave para tornar a consulta "SUM" mais rápida. No InnoDB, o PRIMARY KEYé agrupado com os dados. select sum(likes_count) FROM ... where user_id = $pode simplesmente percorrer um subconjunto da tabela para obter SUMaquele usuário.

    • select * from post where id = $é uma "consulta pontual". Portanto, será rápido o suficiente se ida primeira coluna do PK for um índice secundário. (PK seria mais rápido, mas estamos falando da ordem de um milissegundo.)

    • "os dados dos usuários são isolados pela coluna user_id" - Quanto "isolamento" você deseja? As afirmações acima explicam que você tem o suficiente para desempenho.

    Quanto às 4 perguntas...

    • Geralmente não vale a pena medir o tamanho e a contagem de páginas.
    • Os nós BTree se dividem e se recombinam de maneiras aparentemente aleatórias.
    • Minimizar as páginas necessárias para uma consulta é o verdadeiro objetivo. Refiro-me a isso quando sugiro que isso (user_id, ...)ajude a consulta SUM.
    • Discuto as duas questões acima; se houver outras consultas "caras", irei analisá-las.
    • 0

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