Sunteți pe pagina 1din 8

1.

ÍNDICE EN MYSQL
• Estructura de datos (fichero) que aceleran el acceso a los registros en las tablas de nuestra
BBDD. Un índice contiene el valor de una fila y su dirección física en disco.
• Se sacrifica espacio de disco a cambio de ahorro de procesamiento en la CPU.
• Los índices se crean sobre los campos en los que se realizan búsquedas más frecuentes,
(sobre campos clave, parte de clave o secundaria, sobre los que se hacen más consultas).

• En una consulta MySQL se leen todos los registros de la tabla (ineficiente con miles)
• Si ordenamos los registros por el código de cuenta, solo hay que localizar el número y
capturar los datos mediante un índice (análogo a un índice de un libro).
• Los índices se crean sobre los campos más utilizados en las consultas.

• Ejemplo. Pag 130

• Más información:
• https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html
1.1. TIPOS DE ÍNDICES
• Parciales: Se hace un índice parcial, en lugar de indexar todo el contenido de un campo de la BD
ALTER TABLE nombreTabla ADD INDEX (columna(120));

• Multicolumna: Son índices definidos sobre más de una columna. También se pueden realizar hacer
índices multicolumna parciales
ALTER TABLE nombreTabla ADD INDEX (col1(120), clo2);

• Secundarios/Cluster:
• Las tablas innoDB usan índices cluster, en el índice asociado a su clave primaria, los datos se guardan
ordenados por clave primaria (el índice incrustado en los datos).
• Las tablas MyISAM los índices se guardan en un área distinta de los datos. La búsqueda por índice
requiere 2 operaciones (leer el índice y leer los datos), con índices incrustados estas búsquedas se
resuelven en 1 sola operación. Una vez localizada la entrada del índice, ya se han localizado los datos.
• Hay que tener cuidado en el uso de índices clúster
– Usar varios índices secundarios con una clave 1ª grande: habrá una copia para cada índice
secundario.
– En operaciones de modificación de claves primarias: reorganizar el tablespace (lugar donde se
guardan los datos para reubicar el nuevo registro) y actualizar los índices secundarios sobre ese
registro.
1.2. ESTRUCTURA DE UN ÍNDICE

• B-tree o árbol b: Índice con estructura de árbol. El árbol está formado por un conjunto de
nodos, cada nodo con valores de índice ordenados que apuntan a registros en disco.
• Al tener un nº variable de nodos hijo dentro de un rango predefinido, al insertar o eliminar en
la estructura la cantidad de nodos hijos varia en esa estructura. Para mantener el nº de
nodos dentro de un rango, los nodos internos se unen o parten.

• R-tree: Índice para datos de tipo espacial o n-dimensionales como coordenadas x, y, z de un


objeto. Cada nodo contiene un nº variable de entradas –con un máximo- cada uno de los
cuales con un puntero al nodo hijo y un MBR () o superficie –volumen mínimo que contiene
todos los puntos existentes en los nodos hijos.

• Hash: Se basa en una función que hace corresponder una clave con valores numericos de
manera que se pueda asociar a cada valor de clave un número que permita localizar el
registro correspondiente. Este número debe limitarse al máximo tamaño de almacenamiento
1.3. ÍNDICES en MySQL
• Al crear índices, junto con el tipo, se puede indicar la estructura del índice (btree o hash). Hay
varios tipos según el tipo de datos y si los campos forman o no una clave
• Son distintos para cada motor de almacenamiento: InnoDB solo soporta BTREE, MyISAM
admite índices tipo BTREE y RTREE (para tipos de datos espaciales)

• Tipos de índices:

 Key o index: Indice normal no único.


 Unique: sobre claves secundarias. No permite almacenar dos valores iguales.
 Primary key: sobre la clave primaria (interesa numéricos o autonuméricos). Todos sus
campos deben ser únicos y no admite NULL.
 Fulltext: Formado por uno o varios campos tipo texto, sobre columnas TEXT, CHAR o
VARCHAR para tablas MyISAM.
MATCH (col1, col2, …) AGAINST (expr [search_modifier])
 Spatial: para objetos geométricos. Para columnas tipo TEXT, CHAR o VARCHAR se
pueden crear índices parciales con un número de caracteres para crear el índice. Para
BINARY, VARBINARY y BLOB cambiar caracteres por bytes.

• Ejemplo 5.1. pag 133


INDICES SEGÚN EL MOTOR DE ALMACENAMIENTO.
• Cada índice tiene características propias en cuanto al tipo de tablas según el motor.
• MySQL usa 2 motores básicos: La diferencia básica está en si son transaccionales (permiten
clausulas COMMIT para confirmar un conjunto de comandos SQL y ROLLBACK para invalidarlos
de modo que las transacciones sean integras) o no.
– InnoDB: transaccional (motor por defecto).
– MyISAM: no transaccional (mayor rapidez, menor memoria y menor seguridad)
• Índices en tablas MyISAM: Al crear una tabla se crean 3 ficheros: tabla.frm (estructura de la
tabla), tabla.MYD (datos) y tabla.MYI (índices).
– Como estructura usan índices b-tree y compresión por prefijo para claves de tipo cadena
– Permite claves empaquetadas.
– Permite escritura retardada.
• Indices en tablas InnoDB: Estas tablas usan tablespaces para guardar los datos e índices. Por
defecto, si no se especifica, al crear tablas innoDB se crean en el directorio de datos 2 ficheros
ibdata1, 2 ficheros ib_logfile0 e ib_logfile1 para los registros y la definición de tablas y columnas
se guardan en un fichero tabla.frm.
– Los índices se guardan junto con los datos en estos ficheros de datos. Usa índices cluster.
– Como estructura de índice usan índices de tipo b-tree.
– Si el administrador no define claves primarias el servidor las crea.
COMANDOS GESTIÓN DE ÍNDICES
• Para optimizar nuestra BBDD necesitamos saber que columnas están indexadas,
cuantos valores tienen o cuanto de grande será el índice.

• Creación de índices (CREATE INDEX):


CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name,...)
[index_type]

Descripción:
• UNIQUE | FULLTEXT | SPATIAL: Es el tipo de índice.
• index_name: nombre del índice.
• index_type: USING (BTREE | HASH) # Puede ser de tipo btree o hash
• index_col_name: col_name [(length)] [ASC | DESC] # nombre columna sobre la
que se crea el índice, tamaño y orden en el que se almacena.
MOSTRAR ÍNDICES
• Mostrar los índices (SHOW INDEX):

SHOW {INDEX | INDEXES | KEYS}


{FROM | IN } tbl_name
[{FROM | IN} db_name]
[WHERE expresion]

La salida contiene los siguientes campos:


• table: nombre de la tabla con el índice.
• non_unique: 1 (unico o UNIQUE) o 0 (no único o PRIMARY).
• key_name: nombre del índice.
• seq_in_index: Para índices multicolumna da el orden dentro del índice desde la iz
• column_name: nombre del campo columna usado para crear el índice.
• collation: Orden del índice. A (ascendente) y null (sin ordenar)
• cardinality: Estimación del número de valores distintos del índice.
• sub_part | Packed |Null | Index_type | Comment | Index_comment
BORRAR ÍNDICES y MODIFICAR TABLA
• Eliminar Índices (DROP INDEX):

DROP INDEX index_name


ON tbl_name

• Otra forma de gestionar los indices es con el comando


ALTER TABLE ADD INDEX
ALTER TABLE DROP INDEX

• Los índices no pueden actualizarse directamente, primero deben ser eliminados y


después añadidos.
• Se deben realizar estadísticas de indices, ya que las tablas cambian con el tiempo
generando ineficiencias, como fragmentación de bloques y estadísticas erróneas.

• Ejemplo 5.2. pag 136

S-ar putea să vă placă și