Estou no processo de criação de uma mesa e isso me fez pensar.
Se eu armazenar, digamos, carros que tenham uma marca (fx BMW, Audi ect.), Fará alguma diferença na velocidade da consulta se eu armazenar a marca como um int ou varchar.
Então é
SELECT * FROM table WHERE make = 5 AND ...;
Mais rápido / mais lento que
SELECT * FROM table WHERE make = 'audi' AND ...;
ou a velocidade será mais ou menos a mesma?
sql
performance
postgresql
select
googletorp
fonte
fonte
Algumas referências aproximadas:
4 milhões de registros no Postgres 9.x
Resultados em 8 GB de RAM, i7, laptop SSD:
então parece que para esta configuração, desde que seus índices caibam na RAM, bigint vs texto de 16 caracteres não faz diferença na velocidade.
fonte
Será um pouco mais rápido usando um int em vez de um varchar. Mais importante para a velocidade é ter um índice no campo que a consulta possa usar para localizar os registros.
Há outra razão para usar um int, que é normalizar o banco de dados. Em vez de ter o texto 'Mercedes-Benz' armazenado milhares de vezes na tabela, você deve armazenar seu id e ter o nome da marca armazenado uma vez em uma tabela separada.
fonte
Mercedes-Benz
armazenar id de milhares de vezes1
. Por exemplocar_brands
, tabela , colunasBrands
eId
. RowMercedes-Benz
e1
. E na colunaBrands
e valor da tabela principal1
. E quandoSELECT
, então primeiro saiaId
da mesacar_brands
e depoisSELECT Something FROM main_table WHERE Brands = (SELECT Id FROM car_brands WHERE Brands = Mercedes-Benz)
. Ou alguma outra abordagem?select something from main_table c inner join car_brands b on b.Id = c.Brands where b.Brands = 'Mercedes-Benz'
.Dividindo o desempenho real da comparação de string versus não flutuantes, neste caso, qualquer tamanho não assinado e assinado não importa. O tamanho é realmente a verdadeira diferença no desempenho. Seja 1byte + (até 126 bytes) versus 1,2,4 ou comparação de 8 bytes ... obviamente não flutuantes são menores do que strings e flutuadores e, portanto, mais amigáveis à CPU em montagem.
A comparação string a string em todos os idiomas é mais lenta do que algo que pode ser comparado em uma instrução pela CPU. Mesmo comparar 8 bytes (64 bits) em uma CPU de 32 bits ainda é mais rápido do que um VARCHAR (2) ou maior. * Novamente, olhe para o assembly produzido (mesmo à mão), é preciso mais instruções para comparar char por char do que numérico CPU de 1 a 8 bytes.
Agora, quanto mais rápido? depende também do volume de dados. Se você estiver simplesmente comparando 5 com 'audi' - e isso é tudo que o seu banco de dados possui, a diferença resultante é tão mínima que você nunca a veria. Dependendo da CPU, implementação (cliente / servidor, web / script, etc) você provavelmente não verá até que faça algumas centenas de comparações no servidor de banco de dados (talvez até alguns milhares de comparações antes que seja perceptível).
Ozz
fonte
Índice ou não, int é muito mais rápido (quanto mais longo o varchar, mais lento ele fica).
Outro motivo: o índice no campo varchar será muito maior do que no int. Para tabelas maiores, pode significar centenas de megabytes (e milhares de páginas). Isso torna o desempenho muito pior, pois apenas a leitura do índice requer muitas leituras de disco.
fonte
Em geral, o int será mais rápido. Quanto mais longo é o varchar, mais lento ele fica
fonte
DICA: Se os valores possíveis para o campo make vai nunca mais (ou raramente) a mudança, você pode usar ENUM como um compromisso. Combina boa velocidade com boa legibilidade.
fonte
enum
tipo de dados? Achei que fosse específico do MySQL.Se você ativar a indexação em qualquer um dos campos, será mais rápido. Quanto à sua pergunta, acho que
int
é mais rápido do quevarchar
.fonte
Um tanto relativo. Sim, INTs serão mais rápidos, mas a questão é se isso é perceptível em sua situação. Os VARCHARs são apenas algumas palavras pequenas ou textos mais longos? e quantas linhas há na tabela? Se houver apenas algumas linhas, provavelmente será totalmente armazenado em buffer na memória (quando solicitado com freqüência), nesse caso, você não notará muita diferença. Então, é claro, há a indexação, que se torna mais importante quando a tabela cresce. Usar SSDs pode ser mais rápido do que HDs com consultas otimizadas. Além disso, bons controladores de disco às vezes aceleram as consultas> 10x. Isso pode deixar espaço para apenas o uso de VARCHARs, o que torna mais fácil ler e escrever consultas (sem necessidade de escrever junções complexas) e acelerar o desenvolvimento. Os puristas, entretanto, irão discordar e sempre normalizarão tudo.
fonte