CLAVE PRINCIPAL larga para tableros Innodb

He escrito y hablado mucho sobre el uso de CLAVES PRIMARIAS cortas con tablas de Innodb debido al hecho de que todas las demás claves se refieren a filas por clave principal. También recomendaría usar claves primarias secuenciales para no terminar con actualizaciones BTREE de clave primaria aleatorias que pueden ser muy costosas.

Hoy me gustaría compartir un ejemplo práctico en el que puede usar una clave principal larga con una distribución de valor diferente a la secuencial.

Para uno de los proyectos, tuve la tarea de almacenar metadatos en miniaturas de imágenes recuperadas de varios sitios web en Internet. Las miniaturas en sí se almacenaron en el disco, por supuesto, pero los metadatos, como el tamaño de la imagen original, el tamaño del archivo y la posición de la miniatura en el disco, se almacenaron en la base de datos:

Por qué uso esta solución en comparación con otras:

tablas innodb – Esta tabla recibe muchas más lecturas que escrituras, por lo que la sobrecarga transaccional de escritura es un pequeño precio a pagar por la cantidad de beneficios – caché de datos e índice en la memoria – entonces el almacenamiento en caché es muy rápido, agrupamiento para clave principal – por lo tanto, para las búsquedas de discos vinculados, los datos se recuperan con 1 IO, no con 2 IO como con las tablas sin clúster. El otro beneficio: es típico ver varias miniaturas del mismo álbum/dominio, y debido a la agrupación, existe una alta probabilidad de que todas provengan de una o varias páginas cercanas, lo que ahorra IO de manera espectacular. No te preocupes por la recuperación – Comprobar/reparar tablas grandes de MyISAM en caso de fallo MySQL/Sistema es doloroso y difícil de evitar.

Clave principal larga – ¿Por qué no usé auto_increment id en este caso? Puedo, pero esto eliminaría los beneficios de la agrupación descritos anteriormente. Además, dado que este es solo el índice que tengo, no tengo una sobrecarga porque esto solo ocurre si se definen los índices adicionales. La clave principal en sí no es mucho más grande que cualquier columna en la que se encuentre, ya que la clave principal BTREE contiene todos los datos de la tabla en hojas de todos modos. Las páginas de nivel superior pueden ser un poco más grandes para palabras clave principales largas, pero por lo general no son excelentes.

Clave principal no secuencial Esto solo se produce como efecto de elegir la URL como clave. Por supuesto, hace que la inserción sea más lenta, ya que son aleatorias y tienen que ocurrir saltos de página. La exploración completa de la tabla para esta tabla también sería lenta porque está bastante fragmentada. La tabla, sin embargo, no recibe ningún escaneo de tabla, solo una búsqueda de una fila por clave principal. Incluso en la práctica, la distribución del valor no es mala en este caso, ya que si decide usar md5 (url) o algo similar como clave: a menudo se insertan demasiadas imágenes de un dominio / álbum y se presiona muy poco al mismo tiempo. haciendo acceso local. mucho mejor.

¿Qué hacen thumb_height y thumb_width en la indexación?
En este caso, es posible que tengamos diferentes tamaños de miniaturas para una misma imagen, por lo que se han agregado. También queríamos mantener el sistema flexible, por lo que si queremos agregar más dimensiones de miniatura, no necesitamos cambiar nada. ¿Por qué ir primero a la URL en lugar del índice? Ya no son selectivos, ya que es posible que queramos obtener todas las miniaturas para la URL de la imagen dada de manera efectiva.

En general, utilicé este ejemplo como ilustración, ninguna recomendación es buena para cada caso y debe verificar qué es importante en su caso en lugar de aceptar recomendaciones generales sin pensar mucho en las suposiciones en las que se basan.

PD Sí, en teoría, la URL puede tener más de 255 caracteres, pero en este caso no importaba.

Author: Ing. Luis

A lo largo de conocer Windows y otros sistemas operativos me eh encontrado con diversos tipos de error, ahora brindo soluciones según mi experiencia-

Deja un comentario