¿Las columnas que no son índices están ordenadas en el disco junto con el índice?

8

¿Las columnas que no son índices están ordenadas en el disco junto con el índice, en MySQL, en MyISAM e InnoDB?

Un pensamiento incorrecto que comencé a escribir:

Creo que probablemente no, ya que no están indexados; si se ordenaran, eso significaría que son índices.

Esto no es correcto porque cada columna de índice está ordenada por su propio orden de contenido, pero le pregunto si se ordena de cada fila (o solo de algunas columnas) con su índice correspondiente.

Para explicarlo, digo: esto sería útil para hacer que la selección de rangos de filas, que se encuentran lado a lado, juntas, por sus índices, sea más rápida. Por ejemplo, si quiero select * where id >1000 and id<2000(puede haber errores en la sintaxis de MySQL, no lo sé bien), entonces, la columna de identificación en sí se puede leer del disco rápidamente porque probablemente sus celdas de 1000 a 2000 permanecen juntas en el disco físico . Pero otro contenido de columna correspondiente a la identificación 1000 a 2000 se puede escribir en diferentes lugares en el disco físico. Si también se ordenan, se leerán más rápido. Creo que tal vez MySQL clasifica automáticamente esas columnas en el disco físico, para el desempeño de tales operaciones.

¿Están ordenados en otros tipos de bases de datos (PostgreSQL, etc.)?

27 de diciembre: veo en las 2 respuestas, que en el caso de que haya una clave primaria / índice agrupada, las filas simples no están ordenadas en el disco físico (como pensé que podría / podría ser), e incluso el índice agrupado es no ordenado, si es b-tree, he leído sobre b-tree y veo que sus nodos, según tengo entendido, permanecen en lugares aleatorios en el disco.

qdinar
fuente

Respuestas:

9

Se pueden ordenar en algunos casos. El índice de clasificación generalmente se denomina clave de agrupación . Si es el caso, toda la tabla se almacena dentro de dicho índice (generalmente en algún tipo de estructura de árbol B).

En el otro caso, la estructura de la tabla se conoce como un montón , las filas se almacenan a medida que avanzan, se eliminan los "agujeros" de las hojas en los bloques de datos y esos agujeros se rellenan más tarde con nuevas filas, por lo que ni siquiera se conserva el "orden de inserción".

MyISAM utiliza la estructura de almacenamiento dinámico , con cada fila identificada por el desplazamiento (tipo de índice de matriz ) en el archivo de datos. Cada índice contiene las columnas indexadas para cada fila, ordenadas en el orden correcto y con el número de desplazamiento para ubicar la fila real. Eso significa que acceder a la fila por cualquier índice significa ubicar los nodos correctos en el índice (árbol B) y luego leer los desplazamientos correctos del archivo de datos (puede ocurrir una búsqueda aleatoria en una parte diferente del disco) )

InnoDB usa la agrupación por la clave primaria (o si no se define ninguna, se usa la primera clave única no nula, o se agrega una columna interna de autoincremento, por lo que las filas siempre se ordenan de alguna manera). En tal caso, un acceso por la clave primaria es "directo", cuando se encuentra el valor adecuado, tiene a mano toda la fila, no es necesario hacer una segunda lectura. Los índices secundarios, por otro lado, no pueden almacenar un desplazamiento como en MyISAM (porque el árbol B se reequilibra dinámicamente, por lo que el desplazamiento de una fila específica puede cambiar en cualquier momento) y almacenan los valores de clave principal de la fila, por lo que un el acceso por una clave secundaria significa dos búsquedas de árbol B en InnoDB.

MS SQL Server ofrece una opción para hacer que la clave primaria (u otro índice) sea agrupada o no agrupada, para que pueda elegir entre el montón (no se agrupa ningún índice) y la estructura de árbol (un índice está agrupado). Todos los demás índices no agrupados almacenan valores especiales (RowID) en el caso del montón o los valores clave agrupados de la fila en el caso del elemento de configuración.

PostgreSQL usa solo tablas de montón , pero le permite reordenarlas por algún índice a pedido (debe activarlo, por lo que las filas se ordenan después de la acción pero las escrituras posteriores en la tabla pueden romper ese orden nuevamente).

TokuDB (un motor de MySQL / MariaDB de terceros) puede usar múltiples claves de agrupación en una sola tabla; efectivamente, mantiene múltiples copias de la tabla, cada una ordenada de manera diferente. Viene con una penalización en las escrituras, pero TokuDB afirma usar algo que ellos llaman índices fractales que deberían hacer que esa penalización sea bastante pequeña.

Si necesita usar esa funcionalidad para algunas consultas, puede "emularla" creando un índice de cobertura , de esa manera las columnas que necesita su consulta están disponibles en el orden correcto en cualquier momento, pero nuevamente significa mantener una copia ordenada de (partes de ) la tabla en sus índices.

jkavalik
fuente
5

La respuesta breve y simple para las bases de datos en general es: no, el orden físico de las filas en una tabla generalmente no es el mismo que en algún índice de esa tabla.

En general (digo en general porque hay casos especiales en los que eso no es cierto) la tabla y el índice son dos estructuras físicas diferentes en el disco. Los RDBM convencionales almacenan datos para que los valores de una fila de tabla (no columna ) se encuentren uno al lado del otro en el disco; las filas en sí no se almacenan en ningún orden en particular. Las entradas de índice, por otro lado, se almacenan en orden; un índice b-tree típico contiene valores ordenados de columnas indexadas (¡pero no otras columnas!) y algún tipo de puntero a la ubicación de toda la fila en la tabla que es, como dije antes, una estructura física separada en el disco.

Dicho esto, hay casos especiales. Por ejemplo, InnoDB de MySQL almacena filas de datos reales en una estructura tipo índice. El índice por el cual las filas se colocan en dicha "tabla de índice" es típicamente la clave principal de la tabla; y dicho índice se llama índice agrupado . Pero, por supuesto, una tabla InnoDB puede tener otros índices y el orden de las filas (es decir, las columnas de fila que se incluyen en el índice respectivo) en esos índices no tiene nada que ver con el orden de las filas en la tabla misma.

zgguy
fuente