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 / 109210
Accepted
Haris ur Rehman
Haris ur Rehman
Asked: 2015-08-07 04:15:20 +0800 CST2015-08-07 04:15:20 +0800 CST 2015-08-07 04:15:20 +0800 CST

Um valor de coluna vazio ocupa o mesmo espaço de armazenamento que um valor de coluna preenchido?

  • 772

Tenho uma tabela com 2 colunas. O tipo de ambas as colunas é definido como varchar(38). Se eu criar uma linha com um valor vazio para uma das colunas, ela ocupará o mesmo espaço de armazenamento como se o valor não estivesse vazio?

Em outras palavras, o MySQL reservará espaço de armazenamento para a coluna (dependendo de seu tipo) quando uma linha for criada?

mysql optimization
  • 2 2 respostas
  • 30345 Views

2 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2015-08-07T07:15:52+08:002015-08-07T07:15:52+08:00

    Da estrutura de linha física do Innodb, marcador nº 7 em REDUNDANT ROW_FORMAT

    Um valor SQL NULL reserva um ou dois bytes no diretório de registro. Além disso, um valor SQL NULL reserva zero bytes na parte de dados do registro se armazenado em uma coluna de comprimento variável . Em uma coluna de comprimento fixo, ele reserva o comprimento fixo da coluna na parte de dados do registro. Reservar o espaço fixo para valores NULL permite que uma atualização da coluna de NULL para um valor não NULL seja feita no local sem causar fragmentação da página de índice.

    Da estrutura de linha física do Innodb, marcador nº 2 em COMPACT ROW_FORMAT

    A parte de comprimento variável do cabeçalho do registro contém um vetor de bits para indicar colunas NULL. Se o número de colunas no índice que pode ser NULL for N, o vetor de bits ocupará CEILING(N/8) bytes . (Por exemplo, se houver de 9 a 15 colunas que podem ser NULL, o vetor de bits usa dois bytes.) As colunas que são NULL não ocupam espaço além do bit neste vetor . A parte de comprimento variável do cabeçalho também contém os comprimentos das colunas de comprimento variável. Cada comprimento leva um ou dois bytes, dependendo do comprimento máximo da coluna. Se todas as colunas no índice forem NOT NULL e tiverem comprimento fixo, o cabeçalho do registro não terá parte de comprimento variável.

    Com base nesses marcadores, veja o que um NULLvalor ocupa para o armazenamento de uma coluna

    • comprimento variável: um valor NULL não ocupa armazenamento na própria linha
    • comprimento fixo: ocupa o espaço reservado

    Agora, você deve decidir entre usar CHAR e VARCHAR por causa do que o primeiro ponto trouxe

    Reservar o espaço fixo para valores NULL permite que uma atualização da coluna de NULL para um valor não NULL seja feita no local sem causar fragmentação da página de índice

    Isso evitará a introdução de qualquer fragmentação de uma linha no caminho depois que os dados não NULL forem armazenados. Isso é algo que discuti antes com relação ao MyISAM: Veja meu post antigo Qual é o impacto no desempenho de usar CHAR vs VARCHAR em um campo de tamanho fixo? .

    • 19
  2. Craig Efrein
    2015-08-07T06:23:22+08:002015-08-07T06:23:22+08:00

    Independentemente do comprimento que você definir para sua coluna varchar, o espaço de armazenamento usado por uma coluna vazia será o mesmo.

    Os tipos CHAR e VARCHAR

    insira a descrição da imagem aqui

    Isso aborda apenas o espaço usado pela coluna varchar e não considera o espaço de armazenamento total usado pela linha, seus índices, chaves primárias e outras colunas.

    Como ypercube menciona em seu comentário, há considerações adicionais para o armazenamento de linhas como um todo quando pelo menos uma coluna anulável está presente.

    Estrutura de linha física do Innodb

    A parte de comprimento variável do cabeçalho do registro contém um vetor de bits para indicar colunas NULL. Se houver de 9 a 15 colunas que podem ser NULL, o vetor de bits usa dois bytes.)

    ...

    A parte de comprimento variável do cabeçalho também contém os comprimentos das colunas de comprimento variável. Cada comprimento leva um ou dois bytes, dependendo do comprimento máximo da coluna. Se todas as colunas no índice forem NOT NULL e tiverem um comprimento fixo, o cabeçalho do registro não terá parte de comprimento variável

    E sim, o espaço de armazenamento usado muda com base no tipo que você escolhe, é fixo ou variável, o agrupamento e outros fatores, como o mecanismo.

    O MySQL faz recomendações sobre como otimizar o armazenamento de dados aqui : Otimizando o tamanho dos dados

    Atualizar

    Uma consideração adicional com varchar e isso é memória. É importante no MySQL limitar o tamanho de uma coluna de comprimento variável o máximo possível. Mesmo que a coluna seja variável e o espaço de armazenamento usado seja variável, o MySQL alocará memória em blocos fixos para armazenar valores. Por exemplo, varchar(200) usará mais memória que varchar(5). Este não é um problema de espaço de armazenamento, mas ainda é algo a ser considerado ao definir suas colunas.

    • 10

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