Objetivo: Capacitar al estudiante para que decida donde y qué tipo de índices deben ser creados para mejorar el rendimiento de las consultas en la base de datos.
1. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
1
12/03/2022
Índices
Unidad 6
Material docente compilado por el profesor Ph.D. Franklin Parrales Bravo para
uso de los cursos de Bases de Datos
2. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
2
12/03/2022
Objetivo general de la Unidad 6
Capacitar al estudiante para que decida donde y qué tipo de
índices deben ser creados para mejorar el rendimiento de las
consultas en la base de datos.
3. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
3
12/03/2022
Diseño físico
▪ Especificación de estructuras de almacenamiento internas
(InnoDB vs MyISAM) y caminos de acceso específicos (índices)
para que las diversas aplicaciones que accedan a la BD tengan un
buen rendimiento
▪ Cada SGBD ofrece varias opciones:
▪ Diferentes tipos de ÍNDICES
▪ Agrupamiento de registros (de distinto tipo) relacionados en los mismos bloques
de disco (CLUSTER de ficheros)
▪ Distintos tipos de técnicas de dispersión (HASHING)
▪ Diferentes valores para los parámetros físicos (tamaño de bloque, de buffers,
...)
▪ ...
▪ El diseño físico es muy dependiente del SGBD comercial seleccionado
▪ Una vez elegido el SGBD, el Diseño Físico consiste en la elección e
implementación de las estructuras más apropiadas para los archivos de la
BD, entre las opciones que ofrece el SGBD
4. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
4
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
5. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
5
12/03/2022
Heap Files
⚫ Filas son añadidas al final
del archivo a medida que se
insertan
⚫ Por lo tanto, el archivo está
desordenado.
⚫ Bueno para escanear
⚫ Las filas eliminadas crean
espacios en el archivo
⚫ El archivo debe compactarse
periódicamente para
recuperar espacio
5
Conjunto
de
registros
6. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
6
12/03/2022
Índices
▪ Un índice es una estructura de datos que proporciona acceso
eficiente a un conjunto de registros(tuplas)
▪ Las hojas del índice son punteros a registros. Los nodos
internos del índice definen su estructura de datos..
Conjunto
de
registros
Condición
sobre el
valor del
atributo
(a>2)
Registros
coincidentes
(a)
clave de
búsqueda
(search key)
índice
7. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
7
12/03/2022
ÍNDICES
• Son el mecanismo de acceso más dinámico: se pueden añadir, suprimir, redefinir
índices de forma más fácil que cambiar una secuencia de clúster, redefinir una
clave de dispersión o cambiar cualquier otro parámetro que afecte al
almacenamiento físico de la BD.
→ se puede posponer la especificación de índices para el final del proceso
de diseño e incluso después de la implementación inicial de la BD.
• Estructura común a muchos SGBD: B-trees → soporta bien diferentes tipos de
consultas (por rango, valores extremos MIN-MAX, ...), inserciones frecuentes,
...
• Pueden ser usados para:
✓ Evitar examinar la tabla completa (Full table scan) (se utiliza el índice
para realizar la examinación) → para ser útil: suma de E/S a índice +
E/S a tabla < E/S a tabla.
✓ Limitar el alcance del examen a tabla: cluster index, ordenación.
✓ Evitar una ordenación.
✓ Evitar el acceso a las tablas para determinadas consultas.
8. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
8
12/03/2022
¿Qué es un índice?
▪ En terminología simple, un índice asigna claves de búsqueda a los
datos correspondientes en el disco mediante diferentes
estructuras de datos en memoria y en disco.
▪ El índice se utiliza para acelerar la búsqueda al reducir el número
de registros a buscar.
▪ En su mayoría, se crea un índice en las columnas especificadas
en la cláusula WHERE de una consulta a medida que la base de
datos recupera y filtra datos de las tablas en función de esas
columnas.
▪ Si no crea un índice, la base de datos escanea todas las filas, filtra las
filas coincidentes y devuelve el resultado.
▪ Con millones de registros, esta operación de escaneo puede demorar
muchos segundos y este alto tiempo de respuesta hace que las API y
las aplicaciones sean más lentas e inutilizables
9. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
9
12/03/2022
Ejemplo Simple en SQL
create index nc on
employees (hundreds2);
create table employees(
ssnum integer not null,
name varchar(20) not null,
lat real, long real,
hundreds1 real,
hundreds2 real
);
create index nc1 on
employees (hundreds2, ssnum, name)
select ssnum,name
from employees
where hundreds2 > 10;
10. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
10
12/03/2022
Veamos un ejemplo sobre MySQL…
▪ Usaremos MySQL con el motor de base de datos InnoDB,
aunque los conceptos explicados en esta unidad son más o
menos los mismos que se aplican en otros servidores de
bases de datos como Oracle, MSSQL, etc.
▪ Cree una tabla llamada index_demo con el siguiente
esquema:
CREATE TABLE index_demo (
name VARCHAR(20) NOT NULL,
age INT,
pan_no VARCHAR(20),
phone_no VARCHAR(20)
)ENGINE=INNODB;
11. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
11
12/03/2022
Veamos un ejemplo…
▪ ¿Cómo verificamos que estamos usando el motor InnoDB?
Ejecute el siguiente comando:
SHOW TABLE STATUS WHERE name = 'index_demo' G;
12. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
12
12/03/2022
Veamos un ejemplo…
▪ Ahora inserte algunos datos aleatorios en la tabla, mi tabla
con 5 filas se ve así:
▪ No he creado ningún índice hasta ahora en esta tabla.
Verifiquemos esto con el comando: SHOW INDEX.
Devuelve 0 resultados.
13. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
13
12/03/2022
Veamos un ejemplo…
▪ En este momento, si ejecutamos una consulta SELECT simple, dado
que no hay un índice definido por el usuario, la consulta escaneará
toda la tabla para encontrar el resultado:
EXPLAIN SELECT * FROM index_demo WHERE name = 'alex';
▪ EXPLAIN muestra cómo el motor de consultas planea ejecutar la consulta.
▪ En la captura de pantalla anterior, puede ver que la columna de rows
devuelve 5 y possible_keys devuelve NULL.
▪ possible_keys representa todos los índices disponibles que se pueden usar
en esta consulta.
▪ La columna key representa qué índice se utilizará realmente de todos los
índices posibles en esta consulta.
14. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
14
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
15. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
15
12/03/2022
Claves de búsqueda
(Search Keys)
⚫ Una clave de búsqueda (search key) es una
secuencia de atributos/columnas.
create index i1 on accounts(branchnum, balance);
⚫ Tipos de Claves
⚫ Secuencial: el valor de la clave es monotónico con
el orden de inserción (por ejemplo, contador o
timestamp/marca de tiempo)
⚫ No secuencial: el valor de la clave no está
relacionado con la orden de inserción (por ejemplo,
número de seguro social)
16. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
16
12/03/2022
Primary Key
▪ La consulta anterior es muy ineficiente. Para optimizar dicha consulta
haremos de la columna phone_no una Primary Key asumiendo que no
pueden existir dos usuarios en nuestro sistema con el mismo número de
teléfono.
▪ Tenga en cuenta lo siguiente al crear una clave principal:
▪ Una Primary Key debe ser parte de muchas consultas vitales en su aplicación.
▪ La Primary Key es una restricción que identifica de forma única cada fila de una tabla.
Si varias columnas forman parte de la Primary Key, esa combinación debe ser única
para cada fila.
▪ La Primary Key debe ser no nula. Nunca haga de los campos nulos su Primary Key.
▪ Según los estándares ANSI SQL, las Primary Key deben ser comparables entre sí, y
definitivamente debería poder saber si el valor de la columna de la Primary Key para
una fila en particular es mayor, menor o igual que el mismo de otra fila.
▪ Dado que NULL significa un valor indefinido en los estándares SQL, no puede
comparar NULL de manera determinista con ningún otro valor, por lo que lógicamente
NULL no está permitido.
▪ El tipo de Primary Key ideal debería ser un número como INT o BIGINT porque las
comparaciones de enteros son más rápidas, por lo que atravesar el índice será muy
rápido.
A menudo, definimos un campo de identificación como AUTO INCREMENT en las tablas y lo usamos como Primary
Key, pero la elección de una clave principal depende de los desarrolladores.
17. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
17
12/03/2022
¿Qué sucede si no crea ninguna Primary Key
usted mismo?
▪ No es obligatorio crear una Primary Key usted mismo. Si no ha
definido ninguna Primary Key, InnoDB implícitamente crea una
para usted porque, por diseño, InnoDB debe tener una Primary
Key en cada tabla. Entonces, una vez que crea una Primary Key
más adelante para esa tabla, InnoDB elimina la Primary Key
previamente definida automáticamente.
▪ Como no tenemos ninguna Primary Key definida a partir de ahora,
veamos qué creó InnoDB por defecto para nosotros:
SHOW EXTENDED INDEX FROM index_demo;
EXTENDED muestra todos los índices que no son utilizables por el usuario pero administrados
completamente por MySQL.
18. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
18
12/03/2022
¿Qué sucede si no crea ninguna Primary Key
usted mismo?
▪ Aquí vemos que MySQL ha definido un índice compuesto
(hablaremos de los índices compuestos más adelante) en
DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR y todas las
columnas definidas en la tabla.
▪ En ausencia de una clave principal definida por el usuario,
este índice se utiliza para buscar registros de forma única.
19. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
19
12/03/2022
¿Cuál es la diferencia entre key (clave)
e index (índice)?
▪ Aunque los términos key e index se usan indistintamente, key
significa una restricción impuesta sobre el comportamiento de la
columna. En este caso, la restricción es que la Primary Key es un
campo no nulo que identifica de forma única cada fila. Por otro
lado, el índice es una estructura de datos especial que facilita la
búsqueda de datos en la tabla.
▪ Ahora creemos el Primary Key en phone_no y examinemos el
índice creado:
▪ Tenga en cuenta que CREATE INDEX no se puede usar para
crear un Primary Key, pero se usa ALTER TABLE.
ALTER TABLE index_demo ADD PRIMARY KEY (phone_no);
SHOW INDEXES FROM index_demo;
20. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
20
12/03/2022
¿Cuál es la diferencia entre key (clave)
e index (índice)?
En la captura de pantalla anterior, vemos que se crea un índice principal en la
columna phone_no. Las columnas de las siguientes imágenes se describen de
la siguiente manera:
▪ Table: la tabla en la que se crea el índice.
▪ Non_unique: si el valor es 1, el índice no es único, si el valor es 0, el índice
es único.
▪ Key_name: El nombre del índice creado. El nombre del primary index
siempre es PRIMARY en MySQL, independientemente de si proporcionó
algún nombre de índice o no al crear el índice.
▪ Seq_in_index: el número de secuencia de la columna en el índice. Si
varias columnas forman parte del índice, el número de secuencia se
asignará en función de cómo se ordenaron las columnas durante el tiempo
de creación del índice. El número de secuencia comienza desde 1.
21. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
21
12/03/2022
¿Cuál es la diferencia entre key (clave)
e index (índice)?
▪ Collation: cómo se ordena la columna en el índice. A significa ascendente, D
significa descendente, NULL significa no ordenado.
▪ Cardinality: el número estimado de valores únicos en el índice. Más cardinalidad
significa mayores posibilidades de que el optimizador de consultas elija el índice
para las consultas.
▪ Sub_part: el prefijo del índice. Es NULL si se indexa toda la columna. De lo
contrario, muestra el número de bytes indexados en caso de que la columna esté
parcialmente indexada. Definiremos el índice parcial más adelante.
▪ Packed: indica cómo se empaqueta la clave; NULL si no lo es.
▪ Null: SÍ si la columna puede contener valores NULOS y en blanco si no los
contiene.
▪ Index_type: indica qué estructura de datos de indexación se utiliza para este
índice. Algunos posibles candidatos son: BTREE, HASH, RTREE o FULLTEXT.
▪ Comment: La información sobre el índice no descrita en su propia columna.
▪ Index_comment: el comentario para el índice especificado cuando creó el índice
con el atributo COMMENT.
22. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
22
12/03/2022
¿Cuál es la diferencia entre key (clave)
e index (índice)?
▪ Ahora veamos si este índice reduce el número de filas que se buscarán
para un phone_no determinado en la cláusula WHERE de una consulta.
▪ En esta captura, observe que la columna de rows solo ha devuelto 1, las
possible_keys & key devuelven PRIMARY.
▪ Entonces, esencialmente significa que al usar el índice principal llamado
PRIMARY (el nombre se asigna automáticamente cuando crea la Primary
Key), el optimizador de consultas simplemente va directamente al registro y
lo obtiene.
▪ Es muy eficiente. Esto es exactamente para lo que sirve un índice:
minimizar el alcance de la búsqueda a costa de espacio adicional.
EXPLAIN SELECT * FROM index_demo WHERE phone_no = '9281072002';
23. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
23
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
24. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
24
12/03/2022
Índice Clúster (Índice primario)
▪ Un índice clúster se coloca con los
datos en el mismo espacio de
tablas o el mismo archivo de disco.
▪ Puede considerar que un índice
clúster sigue una representación
B-Tree cuyos nodos de hoja son los
bloques de datos reales en el disco,
ya que el índice y los datos residen
juntos.
▪ Este tipo de índice organiza
físicamente los datos en el disco
según el orden lógico de la clave de
índice.
Records
Un índice clúster en el atributo
X coloca registros cuyos valores
X están cerca uno del otro.
25. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
25
12/03/2022
¿Qué significa la organización
física de los datos?
▪ Físicamente, los datos se organizan en el disco en miles o
millones de discos/bloques de datos.
▪ Para un índice clúster, no es obligatorio que todos los
bloques de disco se almacenen de forma
contigua(contagiously stored).
▪ Los bloques de datos físicos se mueven todo el tiempo aquí y
allá por el sistema operativo cuando es necesario.
▪ Un sistema de base de datos no tiene ningún control
absoluto sobre cómo se administra el espacio de datos
físicos, pero dentro de un bloque de datos, los registros se
pueden almacenar o administrar en el orden lógico del index
key.
26. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
26
12/03/2022
¿Qué significa la organización
física de los datos?
El siguiente diagrama simplificado lo
explica:
▪ El rectángulo grande de color
amarillo representa un bloque de
disco/bloque de datos
▪ Los rectángulos de color azul
representan datos almacenados
como filas dentro de ese bloque
▪ El área de pie de página
representa el índice del bloque
donde residen pequeños
rectángulos de color rojo en el
orden ordenado de una clave en
particular. Estos pequeños
bloques no son más que una
especie de punteros que
apuntan a los offsets de los
registros.
27. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
27
12/03/2022
¿Qué significa la organización física de
los datos?
▪ Los registros se almacenan en el bloque de disco en cualquier orden
arbitrario. Cada vez que se agregan nuevos registros, se agregan en el
siguiente espacio disponible. Cada vez que se actualiza un registro
existente, el sistema operativo decide si ese registro aún puede caber en la
misma posición o se debe asignar una nueva posición para ese registro.
▪ Por lo tanto, la posición de los registros es manejada completamente por el
sistema operativo y no existe una relación definida entre el orden de dos
registros. Para recuperar los registros en el orden lógico de la clave, las
páginas del disco contienen una sección de índice en el pie de página, el
índice contiene una lista de punteros de desplazamiento en el orden de la
clave. Cada vez que se modifica o crea un registro, se ajusta el índice.
▪ De esta manera, realmente no necesita preocuparse por organizar el registro
físico en un orden determinado, sino que se mantiene una pequeña sección
de índice en ese orden y obtener o mantener registros se vuelve muy fácil.
28. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
28
12/03/2022
Ventaja del índice clúster:
▪ Esta ordenación o ubicación conjunta de datos relacionados
en realidad hace que un índice clúster sea más rápido.
▪ Cuando se obtienen datos del disco, el sistema lee el bloque
completo que contiene los datos, ya que nuestro sistema de
E/S del disco escribe y lee datos en bloques.
▪ Entonces, en el caso de consultas de rango, es muy posible
que los datos colocados se almacenen en la memoria.
▪ Digamos que requieres ejecutar la siguiente consulta:
SELECT * FROM index_demo WHERE phone_no > '9010000000’
AND phone_no < '9020000000'
29. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
29
12/03/2022
Ventaja del índice clúster:
▪ Un bloque de datos se recupera en la memoria cuando se ejecuta
la consulta. Digamos que el bloque de datos contiene phone_no
en el rango de 9010000000 a 9030000000. Entonces, cualquier
rango que haya solicitado en la consulta es solo un subconjunto
de los datos presentes en el bloque.
▪ Si ahora activa la siguiente consulta para obtener todos los
números de teléfono en el rango, digamos desde 9015000000
hasta 9019000000, no necesita obtener más bloques del disco.
▪ Los datos completos se pueden encontrar en el bloque de datos actual,
por lo que clustered_index reduce la cantidad de E/S de disco
colocando los datos relacionados tanto como sea posible en el mismo
bloque de datos. Esta reducida E/S de disco provoca una mejora en el
rendimiento.
▪ Entonces, si tiene una primary key bien elegida y sus consultas se
basan en la primary key, el rendimiento será súper rápido.
30. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
30
12/03/2022
Relación entre Primary Key e
Índice Clúster:
▪ No puede crear un índice clúster manualmente usando
InnoDB en MySQL. MySQL lo elige por ti. Pero, ¿cómo
elige? Los siguientes extractos son de la documentación de
MySQL:
▪ Cuando define una PRIMARY KEY en su tabla, InnoDB la usa
como índice agrupado. Defina una clave principal para cada tabla
que cree. Si no hay una columna lógica única y no nula o un
conjunto de columnas, agregue una nueva columna auto-
increment, cuyos valores se completan automáticamente.
▪ Si no define una PRIMARY KEY para su tabla, MySQL ubica el
primer índice UNIQUE donde todas las columnas key (clave) son
NOT NULL e InnoDB lo usa como índice clúster.
31. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
31
12/03/2022
Relación entre Primary Key e
Índice Clúster:
▪ Si la tabla no tiene PRIMARY KEY o un índice UNIQUE
adecuado, InnoDB genera internamente un índice clúster
oculto llamado GEN_CLUST_INDEX en una columna
sintética que contiene valores de ID de fila. Las filas están
ordenadas por el ID que InnoDB asigna a las filas en dicha
tabla. El ID de fila es un campo de 6 bytes que aumenta de
forma monótona a medida que se insertan nuevas filas. Por
lo tanto, las filas ordenadas por ID de fila están físicamente
en orden de inserción.
▪ En resumen, el motor MySQL InnoDB en realidad
administra el índice principal como un índice clúster
para mejorar el rendimiento, por lo que la primary key
y el registro real en el disco se agrupan juntos.
32. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
32
12/03/2022
Estructura del Primary key (clustered)
Index:
▪ Un índice generalmente se mantiene como un árbol B+ en el
disco y en la memoria, y cualquier índice se almacena en
bloques en el disco. Estos bloques se denominan bloques de
índice.
▪ Las entradas en el bloque de índice siempre se ordenan en
la clave de índice/búsqueda. El bloque de índice de hoja del
índice contiene un localizador de filas. Para el índice
principal, el localizador de filas se refiere a la dirección virtual
de la ubicación física correspondiente de los bloques de
datos en el disco donde residen las filas que se ordenan
según la clave de índice.
33. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
33
12/03/2022
Estructura del Primary key
(clustered) Index:
▪ En el siguiente diagrama, los
rectángulos del lado izquierdo
representan bloques de índice
de nivel de hoja y los
rectángulos del lado derecho
representan los bloques de
datos.
▪ Lógicamente, los bloques de
datos parecen estar alineados
en un orden ordenado, pero
como ya se describió
anteriormente, las ubicaciones
físicas reales pueden estar
dispersas aquí y allá.
34. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
34
12/03/2022
Índice Clúster
Índex tiene una estructura para hacer mas rápida la búsqueda. Hace que el último
nivel sea ordenado físicamente, implica que todo registro que aparezca en esa página
va a estar ordenado. Así pues, SOLO SE PUEDE CREAR UN INDICE CLUSTER
POR TABLA.
Index page Data Page
Dado que un índice
clúster afecta la
organización física de
los datos, solo puede
haber un índice clúster
por tabla.
35. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
35
12/03/2022
Índice Clúster
36. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
36
12/03/2022
Índice Clúster
37. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
37
12/03/2022
Índice Clúster
38. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
38
12/03/2022
¿Es posible crear un primary index
en una clave no primaria?
▪ En MySQL, un índice principal se crea
automáticamente y ya hemos descrito anteriormente
cómo MySQL elige el índice principal.
▪ Pero en el mundo de las bases de datos, en realidad
no es necesario crear un índice en la columna de
primary key; el índice principal también se puede crear
en cualquier columna que no es primary key.
▪ Pero cuando se crea en la primary key, todas las
entradas de clave son únicas en el índice, mientras que
en el otro caso, el índice principal también puede tener
una clave duplicada.
39. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
39
12/03/2022
¿Es posible eliminar una primary key?
▪ Es posible eliminar una primary key. Cuando
elimina una primary key, el índice clúster
relacionado y la propiedad de unicidad de esa
columna se pierden.
ALTER TABLE `index_demo` DROP PRIMARY KEY;
- If the primary key does not exist, you get the following error:
"ERROR 1091 (42000): Can't DROP 'PRIMARY'; check that column/key exists"
40. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
40
12/03/2022
Ventajas y desventajas de un Primary Index
Ventajas
▪ Las consultas de rango basadas en el
Primary Index son muy eficientes.
Puede existir la posibilidad de que el
bloque de disco que la base de datos
ha leído del disco contenga todos los
datos que pertenecen a la consulta,
ya que el Primary Index está
agrupado(clusterizado) y los registros
están ordenados físicamente.
Entonces, la localidad de los datos
puede ser proporcionada por el
Primary Index.
▪ Cualquier consulta que aproveche la
Primary Key es muy rápida.
Desventajas
▪ Dado que el Primary Index contiene
una referencia directa a la dirección
del bloque de datos a través del
espacio de direcciones virtuales y los
bloques de disco están organizados
físicamente en el orden de la clave de
índice, cada vez que el sistema
operativo realiza alguna división de
página del disco debido a
operaciones DML como INSERTAR /
ACTUALIZAR / ELIMINAR, el índice
principal también debe actualizarse.
Por lo tanto, las operaciones DML
ejercen cierta presión sobre el
rendimiento del Primary Index.
41. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
41
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
42. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
42
12/03/2022
Índice NO Clúster(Índice secundario)
▪ Cualquier índice que no sea un índice
clúster se denomina índice secundario.
▪ Los índices secundarios no afectan las
ubicaciones de almacenamiento físico a
diferencia de los índices primarios.
▪ ¿Cuándo necesita un índice
secundario?
▪ Es posible que tenga varios casos de uso
en su aplicación en los que no consulta la
base de datos con una clave principal.
▪ En nuestro ejemplo, phone_no es la
clave principal, pero es posible que
necesitemos consultar la base de datos
con pan_no o name.
▪ En tales casos, necesita índices
secundarios en estas columnas si la
frecuencia de tales consultas es muy alta.
Records
⚫ Un índice no clúster no restringe
la organización de la tabla.
⚫ Puede haber varios índices no
clúster por tabla.
43. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
43
12/03/2022
¿Cómo crear un índice
secundario en MySQL?
▪ El siguiente comando crea un índice secundario en
la columna de nombre en la tabla index_demo.
CREATE INDEX secondary_idx_1 ON index_demo (name);
44. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
44
12/03/2022
Estructura del índice secundario:
▪ En el siguiente diagrama, los rectángulos de color rojo
representan bloques de índice secundarios. El índice
secundario también se mantiene en el Árbol B+ y se ordena
según la clave en la que se creó el índice. Los nodos hoja
contienen una copia de la clave de los datos
correspondientes en el índice principal.
▪ Entonces, para entender, puede suponer que el índice
secundario tiene una referencia a la dirección de la clave
principal, aunque no es el caso. La recuperación de datos a
través del índice secundario significa que tiene que atravesar
dos árboles B+: uno es el árbol B+ del índice secundario y el
otro es el árbol B+ del índice primario.
45. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
45
12/03/2022
Estructura del índice secundario:
46. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
46
12/03/2022
Índice No Clúster
▪ No ordena la pagina de datos, cada registro que
tiene en el ultimo nivel, cada registro que tiene se
ata a un puntero de tablas.
47. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
47
12/03/2022
Índice No Clúster
48. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
48
12/03/2022
Ventajas y desventajas de un Secondary Index
Ventajas
▪ Lógicamente puedes crear
tantos índices secundarios
como quieras.
▪ Pero, en realidad, cuántos
índices realmente se requieren
requiere un proceso de
reflexión serio, ya que cada
índice tiene su propia
penalización.
Desventajas
▪ Con operaciones DML como DELETE / INSERT ,
el índice secundario también debe actualizarse
para que la copia de la columna de la clave
principal pueda eliminarse / insertarse. En tales
casos, la existencia de muchos índices
secundarios puede crear problemas.
▪ Además, si una clave principal es muy grande
como una URL, dado que los índices secundarios
contienen una copia del valor de la columna de la
clave principal, puede ser ineficiente en términos
de almacenamiento.
▪ Más claves secundarias significan una mayor
cantidad de copias duplicadas del valor de la
columna de la clave principal, por lo tanto, más
almacenamiento en el caso de una clave principal
grande. Además, la clave principal en sí misma
almacena las claves, por lo que el efecto
combinado en el almacenamiento será muy alto.
49. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
49
12/03/2022
Consideración antes de eliminar
un Primary Index:
▪ En MySQL, puede eliminar un primary index eliminando la primary
key.
▪ Ya hemos visto que un índice secundario depende de un índice
primario.
▪ Entonces, si elimina un índice principal, todos los índices secundarios
deben actualizarse para contener una copia de la nueva clave de índice
principal que MySQL ajusta automáticamente.
▪ Este proceso es costoso cuando existen varios índices secundarios.
Además, otras tablas pueden tener una referencia de clave externa a la
clave principal, por lo que debe eliminar esas referencias de clave
externa antes de eliminar la clave principal.
▪ Cuando se elimina una primary key, MySQL crea
automáticamente otra primary key internamente, y esa es una
operación costosa.
50. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
50
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
51. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
51
12/03/2022
UNIQUE Key Index:
▪ Al igual que las primary keys, las unique keys también pueden
identificar registros de forma única con una diferencia: la columna
de unique keys (clave única) puede contener valores nulos.
▪ A diferencia de otros servidores de bases de datos, en MySQL
una columna de unique key puede tener tantos valores nulos
como sea posible. En el estándar SQL, nulo significa un valor
indefinido. Entonces, si MySQL tiene que contener solo un valor
nulo en una columna de unique keys, debe asumir que todos los
valores nulos son iguales.
▪ Pero, lógicamente, esto no es correcto, ya que nulo significa
indefinido, y los valores indefinidos no se pueden comparar entre
sí, es la naturaleza de nulo. Como MySQL no puede afirmar si
todos los valores nulos significan lo mismo, permite múltiples
valores nulos en la columna.
52. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
52
12/03/2022
UNIQUE Key Index:
▪ El siguiente comando muestra cómo crear un índice
de clave única(unique key) en MySQL:
CREATE UNIQUE INDEX unique_idx_1 ON index_demo (pan_no);
53. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
53
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
54. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
54
12/03/2022
Composite Index:
▪ MySQL le permite definir índices en múltiples columnas, hasta 16
columnas. Este índice se denomina índice
multicolumna/compuesto/compuesto.
▪ Digamos que tenemos un índice definido en 4 columnas: col1, col2, col3,
col4.
▪ Con un índice compuesto, tenemos capacidad de búsqueda en col1, (col1,
col2) , (col1, col2, col3) , (col1, col2, col3, col4).
▪ Entonces podemos usar cualquier prefijo del lado izquierdo de las
columnas indexadas, pero no podemos omitir una columna del medio y
usar eso como - (col1, col3) o (col1, col2, col4) o col3 o col4 etc. Estos son
combinaciones inválidas.
▪ Los siguientes comandos crean 2 índices compuestos en nuestra tabla:
CREATE INDEX composite_index_1 ON index_demo (phone_no, name, age);
CREATE INDEX composite_index_2 ON index_demo (pan_no, name, age);
55. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
55
12/03/2022
Composite Index:
▪ Si tiene consultas que contienen una cláusula WHERE en varias columnas,
escriba la cláusula en el orden de las columnas del índice compuesto. El
índice beneficiará esa consulta. De hecho, mientras decide las columnas
para un índice compuesto, puede analizar diferentes casos de uso de su
sistema e intentar determinar el orden de las columnas que beneficiará a la
mayoría de sus casos de uso.
▪ Los índices compuestos también pueden ayudarlo en las consultas JOIN &
SELECT. Ejemplo: en la siguiente consulta SELECT *, se utiliza
composite_index_2.
▪ Cuando se definen varios índices, el optimizador de consultas de MySQL
elige el índice que elimina la mayor cantidad de filas o escanea la menor
cantidad de filas posible para una mayor eficiencia.
56. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
56
12/03/2022
¿Por qué usamos índices compuestos? ¿Por qué no
definir múltiples índices secundarios en las
columnas que nos interesan?
▪ MySQL usa solo un índice por tabla por consulta, excepto
para la UNION. (En la UNION, cada consulta lógica se
ejecuta por separado y los resultados se fusionan). Por lo
tanto, definir varios índices en varias columnas no garantiza
que esos índices se utilizarán incluso si son parte de la
consulta.
▪ MySQL mantiene algo llamado estadísticas de índice que
ayuda a MySQL a inferir cómo se ven los datos en el
sistema. Sin embargo, las estadísticas de índice son una
generalización, pero en función de estos metadatos, MySQL
decide qué índice es apropiado para la consulta actual.
57. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
57
12/03/2022
¿Cómo funciona el índice compuesto?
▪ Las columnas utilizadas en los índices compuestos se
concatenan juntas y esas claves concatenadas se
almacenan ordenadas mediante un árbol B+. Cuando realiza
una búsqueda, la concatenación de sus claves de búsqueda
se compara con las del índice compuesto. Entonces, si hay
alguna discrepancia entre el orden de las claves de
búsqueda y el orden de las columnas del índice compuesto,
no se puede usar el índice.
▪ En nuestro ejemplo, para el
siguiente registro, se forma
una clave de índice compuesto
al concatenar pan_no, name,
age — HJKXS9086Wkousik28.
+--------+------+------------+------------+
name
age
pan_no
phone_no
+--------+------+------------+------------+
kousik
28
HJKXS9086W
9090909090
58. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
58
12/03/2022
¿Cómo identificar si necesita un
índice compuesto?:
▪ Analice sus consultas primero de acuerdo con sus casos de
uso. Si ve que ciertos campos aparecen juntos en muchas
consultas, puede considerar crear un índice compuesto.
▪ Si está creando un índice en col1 y un índice compuesto en
(col1, col2), entonces solo el índice compuesto debería estar
bien. col1 solo puede ser atendido por el índice compuesto
en sí mismo, ya que es un prefijo del lado izquierdo del
índice.
▪ Considere la cardinalidad. Si las columnas utilizadas en el
índice compuesto terminan teniendo una alta cardinalidad
juntas, son buenas candidatas para el índice compuesto.
59. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
59
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
60. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
60
12/03/2022
Covering Index:
▪ Un índice de cobertura(covering) es un tipo especial de índice
compuesto donde todas las columnas especificadas en la consulta
existen en alguna parte del índice. Por lo tanto, el optimizador de
consultas no necesita acceder a la base de datos para obtener los
datos, sino que obtiene el resultado del índice mismo.
▪ Ejemplo: ya hemos definido un índice compuesto en (pan_no,
name, age), así que ahora considere la siguiente consulta:
▪ Las columnas mencionadas en las cláusulas SELECT & WHERE
son parte del índice compuesto. Entonces, en este caso, podemos
obtener el valor de la columna de edad del propio índice
compuesto. Veamos qué muestra el comando EXPLAIN para esta
consulta:
SELECT age FROM index_demo WHERE pan_no = 'HJKXS9086W' AND name = 'kousik'
EXPLAIN FORMAT=JSON SELECT age FROM index_demo WHERE pan_no = 'HJKXS9086W’
AND name = '111kousik1';
62. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
62
12/03/2022
Covering Index:
▪ En la respuesta anterior, tenga en cuenta que hay
una clave: using_index que se establece en
verdadero, lo que significa que el índice de
cobertura se ha utilizado para responder a la
consulta.
▪ No sé cuánto se aprecian los índices de cobertura
en entornos de producción, pero aparentemente
parece ser una buena optimización en caso de que
la consulta cumpla con los requisitos.
63. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
63
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
64. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
64
12/03/2022
Partial Index:
▪ Ya sabemos que los Índices agilizan nuestras
consultas a costa del espacio. Cuantos más índices
tenga, mayor será el requisito de almacenamiento.
▪ Ya hemos creado un índice llamado second_idx_1 en
el nombre de la columna. El nombre de la columna
puede contener valores grandes de cualquier longitud.
▪ También en el índice, los metadatos de los
localizadores de fila o punteros de fila tienen su propio
tamaño. Entonces, en general, un índice puede tener
una alta carga de almacenamiento y memoria.
65. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
65
12/03/2022
Partial Index:
▪ En MySQL, también es posible crear un índice en los
primeros bytes de datos.
▪ Ejemplo: el siguiente comando crea un índice en los
primeros 4 bytes del nombre.
▪ Aunque este método reduce la sobrecarga de memoria en
cierta cantidad, el índice no puede eliminar muchas filas, ya
que en este ejemplo los primeros 4 bytes pueden ser
comunes a muchos nombres.
▪ Por lo general, este tipo de indexación de prefijos se admite
en las columnas de tipo CHAR, VARCHAR, BINARY,
VARBINARY.
CREATE INDEX secondary_index_1 ON index_demo (name(4));
66. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
66
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
67. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
67
12/03/2022
¿Qué sucede detrás de cámaras
cuando definimos un índice?
▪ Ejecutemos de nuevo el comando SHOW
EXTENDED
SHOW EXTENDED INDEXES FROM index_demo;
68. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
68
12/03/2022
¿Qué sucede detrás de cámaras
cuando definimos un índice?
▪ Definimos el secondary_index_1 en nombre, pero
MySQL ha creado un índice compuesto en (nombre,
número_teléfono) donde número_teléfono es la
columna de primary key.
▪ Creamos secondary_index_2 en age y MySQL creó un
índice compuesto en (age, phone_no).
▪ Creamos composite_index_2 en (pan_no, name, age) y
MySQL ha creado un índice compuesto en (pan_no,
name, age, phone_no).
▪ El índice compuesto composite_index_1 ya tiene
phone_no como parte de él.
69. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
69
12/03/2022
¿Qué sucede detrás de cámaras
cuando definimos un índice?
▪ Entonces, sea cual sea el índice que creemos, MySQL en segundo
plano crea un índice compuesto de respaldo que, a su vez, apunta a
la primary key.
▪ Esto significa que la primary key es un ciudadano de primera clase
en el mundo de la indexación de MySQL. También prueba que todos
los índices están respaldados por una copia del primary index, pero
no estoy seguro de si se comparte una sola copia del primary index
o si se usan diferentes copias para diferentes índices.
▪ Hay muchos otros índices, como el Spatial index y el Full Text
Search index que ofrece MySQL. Todavía no he experimentado con
esos índices, por lo que no los discutiré en esta clase.
70. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
70
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
71. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
71
12/03/2022
¿Por qué volver a generar y
reorganizar índices?
▪ Después de que los índices son creados, se
someterán a un mantenimiento automático de parte
del RDBMS cuando sea que se ejecutan
operaciones insert, update o delete en los datos
subyacentes.
▪ Incluso así, estas modificaciones automáticas
continuamente dispersarán la información en el
índice a través de la base de datos – fragmentando
el índice en el tiempo.
72. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
72
12/03/2022
¿Por qué volver a generar y
reorganizar índices?
▪ El resultado – los índices ahora tienen páginas donde
el orden lógico (basado en el valor de clave) difiere del
orden físico dentro del archivo de datos.
▪ Esto significa que hay un alto porcentaje de espacio libre en
las páginas de índice, y que el RDBMS tiene que leer un
número superior de páginas cuando se escanea cada
índice.
▪ También, el orden de las páginas que pertenecen al mismo
índice se mezcla y esto añade más trabajo al RDBMS
cuando está leyendo un índice – especialmente en términos
de E/S.
73. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
73
12/03/2022
¿Por qué volver a generar y
reorganizar índices?
▪ El impacto de la fragmentación del Índice en algún RDBMS
puede variar de una eficiencia mermada de las consultas
para servidores de impacto bajo en el desempeño, al punto
donde el RDBMS para completamente de usar los índices y
recurre a una última solución – escaneos completos de
tablas para cada consulta.
▪ Como se mencionó al inicio de esta unidad, los escaneos
completos de tablas impactarán drásticamente en el
desempeño de la consulta y esta es la alarma final para
remediar la fragmentación de índice en cualquier RDBMS.
74. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
74
12/03/2022
Ejemplo
Id_Persona int (Pk)
Nombre 100
Apellido 100
Dirección 200
Persona
1024
208 bytes/row
4 row/pag
Idx1(nombre,apellido)
Idx2(apellido,nombre)
100 bytes/row => 10 row/pag
Sumatoria de los índices<= tamaño de paginas/3
Cada cierto tiempo, se debe hacer una
reconstrucción de la base de datos para que
no haya un desperdicio, eso se llama Revire
75. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
75
12/03/2022
Reconstrucción
200000 registros
200000 registros pero
Sin desperdicios(especial
mente en la capa de datos)
2000 registros
200 registros
Si es mas compacta, entonces
existirán menos I/O
1.- se borran todos los índices
2.- se baja la tabla a un archivo
3.- se borra la tabla, el contenido
4.- se sube la tabla en forma ordenada para que el índice
clúster se suba sin desperdicio
76. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
76
12/03/2022
Reconstrucción en MySQL
1. Usa telnet, ssh o máquina local para conectar con el servidor
MySQL y accede a la herramienta de línea de comandos de
MySQL. Puedes hacer esto con mysql -p.
2. Usa el comando "CHECK TABLE nombreTabla FOR UPGRADE"
para verificar que la tabla necesita ser reparada.
3. Sal de la herramienta de línea de comandos de MySQL
escribiendo "x" y pulsando la tecla "Intro". Volverás a la línea de
comandos de consola.
4. Elimina la tabla con el comando "mysqldump": mysqldump
nombreBaseDatos nombreTabla > dump.sql.
5. Vuelve a crear la tabla en la base de datos con el comando de
MySQL: mysql nombreBaseDatos< dump.sql. Esto reconstruirá
la tabla y los índices de la tabla.
https://techlandia.com/reconstruir-indices-mysql-como_42839/
77. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
77
12/03/2022
Contenido
▪ ¿Qué es un índice?
▪ Primary Key
▪ Índice Clúster (Índice primario)
▪ Índice no clúster (Índice secundario)
▪ UNIQUE Key Index
▪ Composite Index
▪ Covering Index
▪ Partial Index
▪ Detrás de cámaras
▪ Reconstrucción de índices
▪ Directrices generales de indexación
78. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
78
12/03/2022
Resumen: Índice Clúster / No clúster
⚫ Índice Clúster (Índice
primario)
⚫ Un índice clúster en el atributo
X coloca registros cuyos
valores X están cerca uno del
otro.
⚫ Índice NO Clúster(Índice
secundario)
⚫ Un índice no clúster no restringe
la organización de la tabla.
⚫ Puede haber varios índices no
clúster por tabla.
Records Records
79. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
79
12/03/2022
Resumen: Restricciones(Constraints) e Índices
⚫ Primary Key, Unique
⚫ Un índice no clúster se construye sobre los atributos que
componen la Primary Key con la restricción de que los
valores son únicos.
⚫ Foreign Key
⚫ De forma predeterminada, no se crea ningún índice para
aplicar una restricción de clave externa.
80. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
80
12/03/2022
Tablas organizadas por índices
▪ Los índices clúster organizan cómo serán almacenados
los datos en el disco
▪ El índice clúster y el almacenamiento pueden ser
ortogonales
▪ Se puede eliminar un índice clúster, en cuyo caso la tabla se
organiza como un archivo de almacenamiento dinámico
▪ Se puede definir un índice clúster en una tabla (anteriormente
organizada como una heap table/tabla montón), que luego se
reorganiza
▪ Tabla organizada por índices
▪ El índice clúster define la organización de la tabla. Es necesario
cuando se define la tabla. No puede ser eliminado (dropped).
81. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
81
12/03/2022
Dense / Sparse Index
⚫ Sparse index
⚫ Los punteros están asociados a
las páginas
⚫ Dense index
⚫ Los punteros están asociados a
los registros.
⚫ Los índices no clúster son densos
P1 Pi
P2 record
record
record
82. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
82
12/03/2022
Conviene UTILIZAR índices...
• sobre tablas medianas/grandes (ocupan gran cantidad de espacio)
• para facilitar el acceso a pequeños porcentajes del total de tuplas (≤20%)
seleccionadas
• y para evitar...
– el recorrido de la tabla completa
– el acceso a tablas para consultas que incluyen un pequeño subconjunto de columnas
(gracias a los índices compuestos)
PERSONA(ssnum, apellido, nombre, edad, telef)
CREATE INDEX idx_perso ON PERSONA(apellido, nombre)
– la ordenación de las tuplas de la tabla (ORDER BY, GROUP BY, UNION,
DISTINCT, JOIN, ...)
– el acceso a ficheros para determinadas consultas (EXISTS, IN, ...)
• Crearlos sobre columnas ...
– que suelen aparecer en cláusulas WHERE, order by, ... (ordenación)
– que suelen ser atributos de reunión de varias tablas (p.ej. claves ajenas)
– con gran variedad de valores (mayor discriminación en las búsquedas)
83. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
83
12/03/2022
Conviene EVITAR los índices...
• si la tabla es muy pequeña (ocupa poco espacio)
• si se degradan los requerimientos de procesamiento crítico
• si el costo de su almacenamiento +mantenimiento >>>> beneficio
– INSERCIÓN, MODIFICACIÓN, ELIMINACIÓN sobre tablas indexadas
mantenimiento del índice (automático, por parte del SGBD)
– A veces conviene CREAR la tabla, rellenarla, y luego CREAR los ÍNDICES
– Y a veces conviene (actualizaciones masivas, reorganizaciones, copias de
seguridad, estadísticas): ELIMINAR ÍNDICES, realizar las MODIFICACIONES
sobre la BD y CREAR de nuevo los ÍNDICES
• Máximo de 4 índices por tabla. Más si rara vez es actualizada
– INDICES necesidad de espacio + velocidad de inserción/eliminación
• Evitar crear índices sobre columnas
– que son actualizadas muy a menudo
– con distribución irregular de valores (selectividad: confunde al optimizador)
– columnas que sólo aparezcan en cláusulas WHERE con funciones u operadores
(distintos a MIN o MAX) → pueden no hacer disponible el camino de acceso
84. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
84
12/03/2022
Directrices generales de indexación
▪ Dado que los índices consumen memoria adicional, decida con
cuidado cuántos y qué tipo de índice serán suficientes para sus
necesidades.
▪ Con las operaciones DML, los índices se actualizan, por lo que las
operaciones de escritura son bastante costosas con los índices.
▪ Cuantos más índices tengas, mayor será el costo. Los índices se
utilizan para acelerar las operaciones de lectura.
▪ Entonces, si tiene un sistema que escribe mucho pero no lee mucho,
piense bien si necesita un índice o no.
▪ La cardinalidad es importante (cardinalidad significa el número de
valores distintos en una columna). Si crea un índice en una
columna que tiene baja cardinalidad, eso no será beneficioso ya
que el índice debería reducir el espacio de búsqueda. La baja
cardinalidad no reduce significativamente el espacio de búsqueda.
85. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
85
12/03/2022
Directrices generales de indexación
▪ Ejemplo:
▪ Si crea un índice en una columna de tipo booleano (INT 1 o 0
solamente), el índice estará muy sesgado ya que la cardinalidad
es menor (la cardinalidad es 2 aquí).
▪ Pero si este campo booleano se puede combinar con otras
columnas para producir una alta cardinalidad, establezca ese
índice cuando sea necesario.
▪ Los índices también pueden necesitar algo de mantenimiento
si aún quedan datos antiguos en el índice.
▪ Deben eliminarse, de lo contrario, colapsará (hogged) la
memoria, así que trate de tener un plan de monitoreo para sus
índices.
86. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
86
12/03/2022
Directrices generales de indexación
▪ Para finalizar, es extremadamente importante
comprender los diferentes aspectos de la
indexación de bases de datos.
▪ Eso te ayudará al diseñar sistemas desde su nivel más
bajo.
▪ En la vida real, muchas optimizaciones de nuestras
aplicaciones dependen del conocimiento de
detalles tan complejos.
▪ Un índice cuidadosamente elegido seguramente le
ayudará a aumentar el rendimiento de su aplicación.
87. Bases de Datos
Ph.D. Franklin Parrales
Carrera de Software
87
12/03/2022
Índices
Unidad 6
Final de la unidad
Y del curso…. !Muchas gracias
a todos!