Estoy en el proceso de crear una mesa y me hizo preguntarme.
Si almaceno, digamos automóviles que tienen una marca (fx BMW, Audi, etc.), ¿habrá alguna diferencia en la velocidad de consulta si almaceno la marca como int o varchar?
Asi es
SELECT * FROM table WHERE make = 5 AND ...;
Más rápido / más lento que
SELECT * FROM table WHERE make = 'audi' AND ...;
o la velocidad será más o menos la misma?
sql
performance
postgresql
select
googletorp
fuente
fuente
Algunos puntos de referencia aproximados:
4 millones de registros en Postgres 9.x
Resultados en portátiles de 8GB RAM, i7, SSD:
por lo que parece que para esta configuración, siempre que sus índices quepan en la RAM, el texto de bigint frente a 16 caracteres no hace ninguna diferencia en la velocidad.
fuente
Será un poco más rápido usar un int en lugar de un varchar. Más importante para la velocidad es tener un índice en el campo que la consulta pueda usar para encontrar los registros.
Hay otra razón para usar un int, y es normalizar la base de datos. En lugar de tener el texto 'Mercedes-Benz' almacenado miles de veces en la tabla, debe almacenar su identificación y guardar el nombre de la marca una vez en una tabla separada.
fuente
Mercedes-Benz
almacenar miles de veces id1
. Por ejemplocar_brands
, tabla , columnasBrands
yId
. FilaMercedes-Benz
y1
. Y en la columnaBrands
y valor de la tabla principal1
. Y cuandoSELECT
, luego primero salgaId
de la mesacar_brands
y luegoSELECT Something FROM main_table WHERE Brands = (SELECT Id FROM car_brands WHERE Brands = Mercedes-Benz)
. ¿O algún otro enfoque?select something from main_table c inner join car_brands b on b.Id = c.Brands where b.Brands = 'Mercedes-Benz'
.Desglosando el rendimiento real de la comparación de cadenas frente a no flotantes, en este caso, cualquier tamaño sin firmar y firmado no importa. El tamaño es en realidad la verdadera diferencia en el rendimiento. Ya sea 1byte + (hasta 126bytes) versus comparación de 1, 2, 4 u 8 bytes ... obviamente, los no flotantes son más pequeños que las cadenas y los flotantes y, por lo tanto, más amigables con la CPU en ensamblaje.
La comparación de cadena a cadena en todos los idiomas es más lenta que algo que la CPU puede comparar en 1 instrucción. Incluso comparar 8 bytes (64 bits) en una CPU de 32 bits es aún más rápido que un VARCHAR (2) o más. * Nuevamente, mire el ensamblaje producido (incluso a mano), se necesitan más instrucciones para comparar char por char que numérico de CPU de 1 a 8 bytes.
Ahora, ¿cuánto más rápido? depende también del volumen de datos. Si simplemente está comparando 5 con 'audi', y eso es todo lo que tiene su base de datos, la diferencia resultante es tan mínima que nunca la verá. Dependiendo de la CPU, la implementación (cliente / servidor, web / script, etc.) probablemente no lo verá hasta que alcance unos cientos de comparaciones en el servidor de base de datos (tal vez incluso un par de miles de comparaciones antes de que se note).
Ozz
fuente
Con índice o no, int es mucho más rápido (cuanto más largo es el varchar, más lento se vuelve).
Otra razón: el índice en el campo varchar será mucho más grande que en int. Para tablas más grandes, puede significar cientos de megabytes (y miles de páginas). Eso hace que el rendimiento sea mucho peor, ya que la lectura del índice solo requiere muchas lecturas de disco.
fuente
En general, el int será más rápido. Cuanto más largo es el varchar, más lento se vuelve
fuente
Consejo: Si los valores posibles para el campo maquillaje serán nunca más (o rara vez) el cambio, puede utilizar ENUM como un compromiso. Combina buena velocidad con buena legibilidad.
fuente
enum
tipo de datos? Pensé que era específico de MySQL.Si activa la indexación en cualquiera de los campos, será más rápido. En cuanto a tu pregunta, creo que
int
es más rápido quevarchar
.fuente
Algo relativo. Sí, los INT serán más rápidos, pero la pregunta es si se nota en su situación. ¿Son los VARCHAR solo algunas palabras pequeñas o textos más largos? y cuantas filas hay en la tabla? Si hay solo unas pocas filas, lo más probable es que esté completamente almacenado en memoria intermedia (cuando se solicite con frecuencia), en ese caso, no notará mucha diferencia. Luego, por supuesto, está la indexación, que se vuelve más importante cuando la tabla crece. Usar SSD puede ser más rápido que HD con consultas optimizadas. Además, los buenos controladores de disco a veces aceleran las consultas> 10 veces. Esto podría dejar espacio para usar VARCHAR, lo que facilita la lectura y escritura de consultas (no es necesario escribir uniones complejas) y acelera el desarrollo. Sin embargo, los puristas no estarán de acuerdo y siempre normalizarán todo.
fuente