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 / 10689
Accepted
Michael McGowan
Michael McGowan
Asked: 2012-01-15 10:56:20 +0800 CST2012-01-15 10:56:20 +0800 CST 2012-01-15 10:56:20 +0800 CST

Tabelas separadas ou particionar uma tabela enorme?

  • 772

Estou construindo uma tabela bastante grande que inclui uma coluna específica, my_column. Há um pequeno número de valores possíveis para my_column, e cada valor exclusivo de my_columndeve ter o mesmo número de linhas associadas a ele. Além disso, é provável que as consultas sejam focadas apenas em um único valor específico de my_columncada vez. Vejo que uma opção seria particionar essa tabela grande com base nos valores de my_column. A outra opção, a meu ver, seria criar uma tabela totalmente separada, de modo que cada tabela se associe exatamente a um valor de my_column. Eu gostaria de saber o que me levaria a escolher uma opção em detrimento da outra.

Pelo que entendi, uma tabela grande particionada parece ser a maneira "correta" ou "pura" de fazer isso, pois esse parece ser o principal caso de uso para partições. No entanto, suspeito que, por razões práticas, a segunda opção seja melhor, e é para isso que estou inclinado. Não sei se isso importa, mas estou lidando com tabelas MyISAM.

mysql database-design
  • 2 2 respostas
  • 4283 Views

2 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-01-15T22:02:17+08:002012-01-15T22:02:17+08:00

    Tenho uma sugestão em relação à sua segunda opção.

    Se você precisar manter as tabelas MyISAM com cada my_columnvalor único separado de outras tabelas MyISAM, você pode querer olhar para o mecanismo de armazenamento MERGE (Mrg_MyISAM) como uma alternativa ao particionamento de tabelas.

    Isso permitirá que suas múltiplas tabelas MyISAM dentro do mesmo banco de dados que possuem estruturas de tabela idênticas e layout de índice sejam mapeadas juntas de forma que uma única consulta atinja todas as tabelas MyISAM.

    Suponha que você tenha uma tabela da seguinte forma:

    CREATE TABLE tb1
    (
        my_column INT NOT NULL
        id INT NOT NULL AUTO_INCREMENT,
        name VARCHAR(30),
        PRIMARY KEY (my_column,id),
        KEY name (my_column,name)
    ) ENGINE=MyISAM;
    

    e você tem 3 dessas tabelas (tb1, tb2, tb3) onde

    • my_column para tb1 = 1
    • my_column para tb2 = 2
    • my_column para tb3 = 3

    Você pode mesclá-los em um único mapeamento de tabela da seguinte maneira:

    CREATE TABLE tbmerge LIKE tb1;
    ALTER TABLE tbmerge ENGINE=Mrg_MyISAM UNION=(tb1,tb2,tb3);
    

    Para realizar uma busca em todas as tabelas, basta usar tbmerge. Por exemplo, suponha que você queira ver todos os nomes de tb2 que começam com 'Jack', execute esta consulta:

    SELECT name FROM tbmerge WHERE my_column=2 AND name LIKE 'Jack%';
    

    Dado o design da tabela, você sempre deve especificar o valor para my_column. Na verdade, para cada índice que tb1 possui, certifique-se de que my_column seja sempre a primeira coluna. A razão? Uma consulta em tbmerge é sempre uma consulta em tb1, tb2, tb3 (todas as tabelas subjacentes). Caso contrário, esta consulta

    SELECT name FROM tbmerge WHERE name LIKE 'Jack%';
    

    experimentará um desempenho horrível porque executará varreduras de tabela em todas as tabelas subjacentes. Planeje cuidadosamente os índices que você usará, seguindo essa regra simples (usando my_column como a primeira coluna de cada índice)

    Há um benefício adicional: você pode INSERT nas tabelas subjacentes conforme sua conveniência, trabalhando assim com o

    Discuti isso usando tabelas MERGE em uma postagem anterior (4 de janeiro de 2012) .

    • 1
  2. Mike Lue
    2012-01-16T19:59:36+08:002012-01-16T19:59:36+08:00

    O particionamento é melhor se a maioria das consultas em seu sistema:

    1. Concentre-se em um único valor (como você mencionou).
    2. As linhas esperadas são de pelo menos 50% (veja detalhes abaixo) para o total de linhas nesse valor.

    Digamos que a seguinte consulta seja adequada para ser revisada para particionamento :

    SELECT *
    FROM single_table
    WHERE my_column = $dedicated_value$
    

    O particionamento não é significativamente melhor do que uma única tabela se suas consultas tiverem outras condições que tornem o resultado apenas uma parte trivial do total de linhas nesse valor. Como exemplo a seguir (suponha que haja um índice composto nas colunas participantes):

    SELECT *
    FROM single_table
    WHERE my_column = $dedicated_value$
        AND some_other_column = $another_dedicated_value$
    

    A porcentagem de linhas esperadas

    A porcentagem usada para avaliar a estratégia depende de quantos valores distintos em "my_column" e o tamanho da linha de sua tabela única original.

    Quanto menos valores distintos você tiver, menos porcentagem de linhas esperadas deve ser considerada. Quanto mais tamanho de linha você tiver, menos porcentagem de linhas esperadas deve ser considerada.

    É melhor projetar alguns experimentos para refletir sua estimativa.

    • 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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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