sql >> Base de Datos >  >> RDS >> Mysql

Velocidad de consulta basada en el orden de las columnas

La respuesta es sí, sí importa, y puede importar mucho, pero normalmente no mucho.

Toda la E/S se realiza a nivel de página (típicamente 2K o 4K dependiendo de su sistema operativo). Los datos de las columnas de las filas se almacenan uno al lado del otro, excepto cuando la página se llena, en cuyo caso los datos se escriben en la otra página (generalmente la siguiente).

Cuanto mayor sea el espacio de datos en disco requerido para las columnas entre (según la definición de la tabla) las columnas que seleccione, mayor será la probabilidad de que los datos de las columnas seleccionadas (a veces) estén en páginas diferentes. Estar en una página diferente puede resultar en una operación de E/S adicional (si no hay otras filas seleccionadas en la otra página). En el peor de los casos, cada columna que seleccione podría estar en una página diferente.

He aquí un ejemplo:

create table bad_layout (
num1 int,
large1 varchar(4000),
num2 int,
large2 varchar(4000),
num3 int,
large3 varchar(4000)
);

create table better_layout (
num1 int,
num2 int,
num3 int,
large1 varchar(4000),
large2 varchar(4000),
large3 varchar(4000)
);

Comparando:seleccione num1, num2, num3 de bad_layout;seleccione num1, num2, num3 de better_layout;

Debido a que para bad_layout, cada columna numérica básicamente estará en una página diferente, cada fila requerirá 3 operaciones de E/S. Por el contrario, para better_layout num, las columnas generalmente estarán en la misma página.

Es probable que la consulta bad_layout tarde unas 3 veces más en ejecutarse.

Un buen diseño de la tabla puede marcar una gran diferencia en el rendimiento de las consultas. Debe intentar mantener las columnas que normalmente se seleccionan juntas lo más cerca posible entre sí en el diseño de la tabla.