Administración de Sistemas Gestores de Bases de Datos Tema 5. Optimización y monitorización Profesor: Juan Ignacio Contreras1 Índice del tema Índices, definición y tipos Optimización SQL Diseño Consultas Otras instrucciones Optimización del servidor Almacenamiento y motores Memoria Rendimiento 2 Índices - Estructuras de datos o ficheros que aceleran el acceso a los datos en las tablas de nuestras bases de datos - Contienen el valor de una fila y su dirección física en disco. - Se crean sobre campos que suelen ser muy utilizados en consultas. - Normalmente se crean sobre campos clave o parte de una clave primaria o secundaria. SELECT * FROM movimientos WHERE código_cuenta=2324 - Sacrificamos algo de espacio a costa de ahorrar CPU en el procesamiento de consultas. 3 Tipos de índices - Parciales: El interés de un índice parcial reside en la ganancia de velocidad. Un índice corto es mucho más rápido. Y podemos suponer que los 10 primeros caracteres del nombre son lo suficiente representativos. - Multicolumna: El valor del índice se obtiene concatenando los valores de los diferentes campos que componen el índice. MySQL solo permite un índice por tabla y consulta. - Secundarios: En InnoDB, las entradas en índices no agrupados (también llamados índices secundarios) contienen el valor de clave primaria de la fila. InnoDB utiliza este valor de clave primaria para buscar la fila a partir del índice agrupado. Nótese que si la clave primaria es larga, los índices secundarios utilizan más espacio. - Cluster: Cada tabla InnoDB tiene un índice especial llamado índice agrupado (clustered index) donde se almacenan los datos de las filas. Si se define una PRIMARY KEY en una tabla, el índice de la clave primaria es el índice agrupado. - 4 Estructura de un índice - B-tree: Índice con estructura de árbol, muy utilizado por su flexibilidad, rendimiento y ahorro de espacio. Además de agilizar las consultas directas por los campos indexados, también agilizan las consultas por rango (BETWEEN) y por comparadores (<, >, >=, <=). MySQL utiliza índices B-Tree en los motores MyISAM e InnoDB. En el caso de InnoDB, el índice está “incrustado”, es decir, que se almacena junto a los datos (y no en un fichero separado como en MyISAM). - Hash: Índice basado en algoritmos de hash que garantiza (casi siempre) la dispersión de valores de la clave. Así se evita que en un rango de valores de índice se acumulen la mayoría de los resultados, como puede suceder en los B-Tree (por ejemplo, que la mayoría de teléfonos se acumulen en las entradas de índice que empiezan por 91 y 93). El algoritmo de hash hace que valores del índice muy similares se indexen separados. - R-tree: Son índices utilizados para datos espaciales y multidimensionales. Permiten localizar rápidamente puntos contenidos en diferentes tipos de áreas. 5 Índices en tablas MyISAM Las tablas MyISAM utilizan índices B-Tree, full-text y R-Tree. No pueden utilizar índices hash. Además, tienen algunas características para mejorar el rendimiento de los índices B-Tree. Compresión de prefijos en claves alfanuméricas. También llamado compresión de prefijos”. Si varias entradas de la columna indexada tienen el mismo prefijo (por ejemplo “http://”) este será comprimido para ahorrar espacio de almacenamiento. Compresión de bytes altos en claves numéricas. También llamado “empaquetamiento de claves”. Es la misma idea que con las claves alfanuméricas, pero aplicada al byte alto de las claves numéricas. Los índices de las tablas MyISAM se guardan los ficheros con el mismo nombre que la tabla y extensión .MYI. MySQL tiene la opción de posponer las actualizaciones del índice de una tabla para cargas masivas de datos. 6 Índices en tablas InnoDB Las tablas InnoDB utilizan índices B-Tree incrustados. Esto las hace muy rápidas en las búsquedas por clave primaria. Además, al tratarse del índice, es frecuente que la página con la clave y los datos ya se encuentre en la caché de disco. Todos los índices en InnoDB son árboles binarios (B-trees) donde las entradas de índice se almacenan en páginas que son las hojas del árbol. 7 Índices en tablas MEMORY (HEAP) El motor de almacenamiento MEMORY crea tablas con contenidos que se almacenan en memoria.Éstas se conocían préviamente como HEAP . En MySQL 5.0, MEMORY es el término preferido, aunque HEAP se soporta para compatibilidad con versiones anteriores. Cada tabla MEMORY está asociada con un fichero de disco. El nombre de fichero comienza con el nombre de la tabla y tiene una exensión de .frm para indicar que almacena la definición de la tabla. Como indica su nombre, las tablas MEMORY se almacenan en memoria y usan índices hash por defecto. Esto las hace muy rápidas, y muy útiles para crear tablas temporales. Sin embargo, cuando se apaga el servidor, todos los datos almacenados en las tablas MEMORY se pierden. Las tablas por sí mismas continúan existiendo ya que sus definiciones se almacenan en ficheros .frm en disco, pero están vacías cuando reinicia el servidor. 8 Índices en tablas BDB En MySQL 5.0, las tablas BDB pueden tener hasta 31 índices por tabla, 16 columnas por índice, y un máximo de tamaño de clave de 1024 bytes. MySQL necesita una PRIMARY KEY en cada tabla BDB para que cada registro pueda identificarse unívocamente. Si no crea una explícitamente, MySQL crea y mantiene una PRIMARY KEY oculta. La clave oculta tiene una longitud de 5 bytes y se incrementa para cada intento de inserción. La PRIMARY KEY es más rápida que cualquier otro índice, ya que la PRIMARY KEY se almacena junto con los datos. Los otros índices se almacenan como los datos claves + la PRIMARY KEY, por lo que es importante mantener la PRIMARY KEY tan pequeña como sea posible para ahorrar espacio en disco y tener más velocidad. 9