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 / 127933
Accepted
dr_
dr_
Asked: 2016-02-02 07:31:32 +0800 CST2016-02-02 07:31:32 +0800 CST 2016-02-02 07:31:32 +0800 CST

O INFORMATION_SCHEMA sempre contém metadados atualizados?

  • 772

Esta consulta imprime o tamanho (em termos de dados e índices) das tabelas em mydatabase :

SELECT table_name "Table name", 
round(((data_length)/1024/1024),2) "Data size",
round(((index_length)/1024/1024),2) "Index size" 
FROM information_schema.TABLES 
WHERE table_schema="mydatabase" AND data_length>1000000 
order by table_name INTO OUTFILE '/tmp/mydatabase_values' 
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

Os tamanhos são impressos em Mb, sendo consideradas apenas tabelas maiores que 1Mb. As tabelas são listadas em ordem alfabética e a saída é salva em um arquivo CSV.

A execução dessa consulta em diferentes pontos no tempo mostrou - obviamente - resultados diferentes à medida que os dados foram alterados no banco de dados. No entanto, apenas nas últimas semanas a consulta produziu resultados idênticos. Isso significa que o tamanho do banco de dados não mudou muito (como você pode ver, o arredondamento é feito no limite de 10Kb) ou há algo que realmente estou perdendo? A pergunta pode parecer absurda, mas as visualizações INFORMATION_SCHEMAsempre mantêm metadados atualizados?

Observação: não, não estou lendo todas as vezes o mesmo arquivo CSV por engano.

Editar: todas as tabelas são InnoDB e innodb_file_per_table=1.

mysql information-schema
  • 1 1 respostas
  • 1408 Views

1 respostas

  • Voted
  1. Best Answer
    Rick James
    2016-02-02T17:38:23+08:002016-02-02T17:38:23+08:00

    Sim, os dados estão atualizados. Mas não leia muito os números.

    InnoDB, especialmente, pré-aloca espaço para linhas futuras. Assim, é bem possível olhar para o tamanho exato de uma tabela, inserir dezenas de linhas (talvez até milhares), então olhar para o tamanho novamente -- e ver exatamente o mesmo Data_length e Index_length.

    Quando você cria uma tabela InnoDB e insere uma pequena linha, o comprimento dos dados será de 16384 bytes (um bloco de 16 KB). À medida que você adiciona mais linhas, eventualmente esse bloco transbordará e outro bloco será adicionado. Mais tarde (conforme a tabela excede algum limite), a tabela crescerá em unidades de (eu acho) 8 MB (uma "extensão"). Isso permitirá que ainda mais linhas sejam adicionadas sem alterar o volume do disco.

    Além disso, a tabela foi criada com innodb_file_per_tableON ou OFF? Isso controla se o material vai para o ibdata1arquivo comum ou para o próprio .ibdarquivo da tabela.

    E, como @jkavalik aponta, e DELETEpode mexer com o tamanho, novamente não necessariamente de maneiras previsíveis.UPDATEALTER

    Editar

    Esses são os tamanhos de "pegada de disco". Compare com o que você pode ver olhando para o sistema de arquivos.

    Uma tabela de 1 linha com um de 4 bytes INTocupa pelo menos 16384 bytes de espaço em disco. Se você está dizendo que "4" é o tamanho real , respondi à pergunta errada. Eu digo que 16KB é o tamanho real .

    Há sobrecarga para cada coluna, para cada linha, para cada bloco, para a estrutura BTree, para cada extensão, para índices, etc. E o InnoDB aloca nada menos que 16KB por vez. E espaço para 'desfazer' cópias de linhas. Portanto, "4" se transforma em "16384".

    Como uma "regra prática", se você somar os tamanhos de dados (4 para INT, etc) das colunas em uma linha, multiplicar pelo número de linhas e, em seguida, multiplicar por algo entre 2 e 3, é provável que você obtenha o "tamanho" da tabela. (O exemplo de 1 coluna e 1 linha, é claro, é um caso final que excede 3x)

    • 4

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