UUID vs autoincremental como clave primaria

Publicado por Andrea Navarro en

UUID vs AutoincrementalAl trabajar con bases de datos como MySql es común utilizar una clave primaría entera autoincremental que permita distinguir y referenciar cada uno de los registros. El problema surge cuando se tienen muchas computadoras remotas escribiendo una gran cantidad de registros al mismo tiempo, en este caso el proceso de inserción sería el cuello de botella ya que la generación de claves, aunque rápida, podría retrasar el ingreso de datos. Si, en cambio, se generan bases por separado para que cada una maneje una carga de inserción menor entonces las claves se repetirían y se perdería la función principal de la clave primaria. Una solución para estos escenarios en la utilización de un UUID como clave primaria.

¿Qué es un UUID?

El UUID, (universally unique identifier) es un número generado de 128 bits. En su forma canónica se expresa como 32 dígitos hexadecimales que son divididos en 5 grupos que al ser separados por guiones da un total de 36 caracteres en total.

Ventajas de utilizar UUID como clave primaria

  • Se garantiza la individualidad de cada clave : Aunque se utilicen varias tables, bases de datos y servidores las UUID seran diferentes.
  • Facilidad de unión de tablas: Si se trabaja en paralelo es posible unir registros o tablas enteras sin generar un conflicto por claves duplicadas
  • Permite la creación de relaciones sin necesidad de esperar a una de las partes: Si la tabla B tiene una relación con la tabla A es posible generar el registro de la tabla B con un UUID y luego agregar el registro en A con el UUID ya generado. En el caso de una clave primaria autoincremental es necesario crear antes el registro A para que pueda asignarse su clave.
  • La creación de claves puede ser externa : Aún trabajando en una misma base de datos la tarea de la creación de la clave puede generarse de manera paralela.

Desventajas de utilizar UUID como clave primaria

  • Ocupan más espacio que una clave autoincremental: Utiliza 128 bytes mientras que un entero utiliza solo 4 bytes.
  • No permiten ordenar rápidamente por fecha de creación: Al utilizar claves autoincrementales el orden se genera automáticamente ya que los números son secuenciales.
  • El proceso de inserción puede ser lento para grandes volúmenes de datos: En algunos experimentos se ha detectado un aumento del tiempo de inserción al aumentar el volumen de datos.

¿Cómo guardar las claves UUID?

Aunque el tamaño de UUID es de 128 bytes es posible utilizar un binario de solo 16 bytes para ahorrar espacio y de esta manera mejorar el rendimiento:

Al crear la tabla es necesario especificar que la clave primaria será un campo binario de 16 bytes

CREATE TABLE `nombreTabla`( 
    `clavePrimaria` BINARY( 16 ) NULL ,
    PRIMARY KEY ( `clavePrimaria` ) 
)ENGINE = INNODB ;

Antes de insertar la clave está deberá ser generada y se deberán suprimir los guiones, luego la función UNHEX lo convertitá en binario antes de insertarlo.

INSERT INTO `nombreTabla` 
( `clavePrimaria` ) VALUES ( UNHEX( 'c985098b44b141059a224ca2640d0885' ) 
);

Al obtener la clave se reconvertirá en hexadecimal con la función HEX y la aplicación debera agregar los guiones de ser necesario.

SELECT HEX(clavePrimaria) AS clavePrimaria FROM `nombreTabla`

Conclusión

La utilización de UUID como claves primarias para base de datos dependerá mucho de la naturaleza de la aplicación, antes de tomar la decisión de no utilizar claves autoincrementales es importante tener en cuenta que la necesidad de una clave única universal no se da en la mayoría de los casos y aunque se plantea como una solución a el problema de la carga en paralelo no es la única disponible.

Hasta la próxima!

 


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora