Esta es la mejor manera que se me ocurrió para convertir una base de datos MySQL GUID/UUID generado por UUID() a un archivo binario(16):

UNHEX(REPLACE(UUID(),'-',''))

Y luego guardarlo en un archivo BINARIO(16)

Hay implicaciones de hacerlo de esta manera que yo debería de saber de?

  • Sí que es, pero que podría conseguir marginal mejoras de rendimiento al que se basó en la aplicación de generación de guid y unhexing y colocación (en mi caso, .NET)
  • puede ser una oblicua respuesta a la OP, pero realmente me gustaría ver tu comentario concretarse con ejemplos.
InformationsquelleAutor thr | 2009-02-13

3 Comentarios

  1. 8

    No muchas implicaciones. Será más lento, las consultas un poco, pero casi no se notan.

    UNIQUEIDENTIFIER se almacena como 16-byte binary internamente de todos modos.

    Si usted va a cargar el binario en un cliente y analizar allí, tenga en cuenta la bit order, puede tener otra representación de cadena de la inicial NEWID().

    Oracle‘s SYS_GUID() función es propensa a este problema, la conversión de una cadena que da resultados diferentes en el cliente y en el servidor.

    • Me gustaría añadir a los comentarios de algunos materiales cavé. Consideraciones en torno a UUID en MySQL debe pensar acerca del rendimiento, así como la singularidad. Mientras que poco más de una interesante prueba de rendimiento fue de aquí: kccoder.com/mysql/uuid-vs-int-insert-performance – Este muestra un punto de sensibilidad alrededor de MySQL y asegurar el «ÚNICO» valores en MySQL. Estoy seguro de que ha habido mejoras, pero el tamaño del campo, la estructura de los contenidos índice, etc. debe ser contemplado que si tienen la oportunidad. BINARIO(16) / CHAR(16) parece ser el camino a seguir.
    • Hacer un poco más de profundidad en la investigación también he llegado a un buen enlace sobre «el manejo de índices BINARIOS». Aquí está el enlace: mysqlserverteam.com/storing-uuid-values-in-mysql-tables – me gustaría animar a todo el mundo mirando una conversión a MySQL para revisar este blog así. Algunos puntos para considerar en torno a cómo ‘óptima’ la tienda de los BINARIOS de identificación. El caso de uso puede variar dependiendo de cómo se implemente UUID pero los grandes puntos en el pedido de bits y el uso de columnas calculadas para cualquier ‘legible’ necesidades.
    • Estoy confundido ¿por qué esto es aceptado, cuando la terminología y los supuestos de la respuesta parece ser exclusiva de MS SQL, no de MySQL.
  2. 2

    De MySQL 8.0 y anteriores que usted podría utilizar UUID_TO_BIN:

    UUID_TO_BIN(string_uuid), UUID_TO_BIN(string_uuid, swap_flag)

    Convierte una cadena UUID a un binario UUID y devuelve el resultado. (El IS_UUID() descripción de la función de las listas de los permitidos, cadena de UUID de formatos.) El retorno binario UUID es de tipo VARBINARY(16) valor.

    CREATE TABLE t (id binary(16) PRIMARY KEY);
    
    INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
    INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
    INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
    
    SELECT *, BIN_TO_UUID(id) FROM t;

    DB-Fiddle.com Demo

    • BIN_TO_UUID() debe ser llamado con el 2º arg también es CIERTO que si UUID_TO_BIN() se llama con ella.
  3. -5

    Me hash en un entero de 8 bytes y almacenar el número entero con una baja de colisión de alta eficiencia algoritmo hash unidireccional como MurmurHash64A. Este utiliza mucho menos espacio y pueden ser indexadas y/o particiones en. Hay un proyecto en SourceForge que incluye MemCached funciones de mySQL ( http://forge.mysql.com/projects/project.php?id=250 ), lo cual podría incluir MurmurHash64A, desde Memchached usa, pero no sé. O mira esta aplicación de FNV para mySQL: http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/

    • No. Un UUID tiene 128 bits. Si usted destrozar la 128 bits UUID y suelta la mitad de sus bits (8 bytes = 64 bits), entonces no hay razón para el uso de un UUID. El punto de usar UUID es tener una probabilidad EXTREMADAMENTE baja de generar duplicados. Si usted hace un 8 número de bits por lanzar una moneda para cada uno de los bits de 256 valores posibles. 4 el número de bits sólo tiene 16. Que son muy propensos a tener duplicados en 64 bits, utiliza google para averiguar qué tan probable.

Dejar respuesta

Please enter your comment!
Please enter your name here