2010-08-11 12 views
28

Ya vi una publicación similar en Stack Overflow, pero no estaba del todo satisfecho.MySQL - usando String como clave principal

Digamos que ofrezco un servicio web. http://foo.com/SERVICEID

SERVICEID es una ID de cadena única utilizada para hacer referencia al servicio (base 64, mayúsculas/minúsculas + números), similar a cómo los servicios de acortador de URL generan ID para una URL.

Entiendo que hay problemas de rendimiento inherentes al comparar cadenas versus enteros.

Pero tengo curiosidad de cómo optimizar al máximo una clave principal de tipo String.

Estoy usando MySQL, (actualmente usando el motor MyISAM, aunque reconozco que no entiendo todas las diferencias de motor).

Gracias.

actualización para mi propósito la cadena era en realidad sólo un número entero base62 codificado, por lo que la clave principal era un entero, y ya que no es probable que supere nunca el tamaño de bigint que simplemente no tiene mucho sentido use cualquier otra cosa (para mi caso de uso particular)

Respuesta

38

No hay nada de malo con el uso de un CHAR o VARCHAR como clave principal.

Seguramente tomará un poco más de espacio que un INT en muchos casos, pero hay muchos casos en los que es la opción más lógica e incluso puede reducir el número de columnas que necesita, mejorando la eficiencia, evitando el necesita tener un campo ID separado. Por ejemplo, los códigos de país o las abreviaturas de estado ya tienen códigos de caracteres estandarizados y esta sería una buena razón para usar una clave principal basada en caracteres en lugar de crear una ID entera arbitraria para cada uno además.

+0

Gracias, estaba bastante seguro de que no sería una gran diferencia, pero quería saber de la comunidad que ha "estado allí hecho eso" –

+5

Nota: para columnas que son solo un código ASCII limitado en lugar de palabras reales (por ejemplo, hash, base64, códigos de país estándar, etc.), puede ser una buena idea usar la intercalación 'ascii_bin'. Si utiliza una intercalación basada en utf-8, reservará 3 o 4 bytes por carácter para las columnas CHAR en lugar de solo 1. – thomasrutter

+0

No utilice códigos de país en sus claves principales. – displayname

Cuestiones relacionadas