Ver Mensaje Individual
  #22 (permalink)  
Antiguo 15/04/2010, 12:39
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: FAQ's de MySQL

Pregunta: Renumerar un campo auto_increment
Respuesta: No es conveniente y es innecesario hacerlo.

a) Un campo AUTO_INCREMENT en MySQL es normalmente usado como PRIMARY KEY.
b) Por definición, una PRIMARY KEY (PK) crea en forma automática un índice agrupado (cluster), que se utiliza para mantener el ordenamiento físico de los registros. Por esa razón también es único (un conjunto de datos no puede tener dos ordenamientos físicos diferentes en el disco (¿como se ordenaría una biblioteca de dos formas al mismo tiempo?)

1. No es conveniente "reorganizar" un índice autoincremental porque en esencia es una tarea sin funcionalidad, carente de practicidad y consumidora innecesaria de tiempo de proceso.

2. El renumerar las PRIMARY KEY de un campo incremental no produce ninguna mejora en la optimización de consultas, por lo que hacerlo solamente resulta en tiempo de PC consumido.

3. Renumerar un campo autoincremental, genera un nuevo ordenamiento FÍSICO de los datos (no olvidar que una PK genera un índice cluster), con la consiguiente sobrecarga del microprocesador, porque tiene que reescribir físicamente la tabla cada vez y reconstruir el índice completamente.

4. Tampoco es recomendable bajo ninguna circunstancia renumerar una PK (es el caso en MySQL donde un AUTOINCREMENT es PK por default) si se usa como FK de otras tablas, porque generará inconsistencia de datos entre registros de tablas relacionadas.

5. No se recomienda renumerar si existen datos históricos de otras transacciones, que hacen referencia a otros registros que tenían el mismo número. De hecho, en una tabla de stock, las ID jamás cambian porque el hecho que un producto ya no exista ni se fabrique no quiere decir que no aparezca en registros más antiguos. Pisar un ID sería lo mismo que ponerle a un recién nacido el número de documento de un muerto.

6. Es irrelevante tener espacios de números que ya no se usan, en tanto la numeración sea secuencial e incremental. Perder tiempo en renumerar sólo hace que una lista quede más bonita, pero eso se puede hacer perfectamente en la interfase, donde se visualiza la tabla de datos, o bien se pueden usar variables de usuario para generar numeraciones temporales sin afectar la tabla.

7. Si la duda es quedarse sin números para usar, un ID generado en un campo numérico UNSIGNED tiene estos rangos:

- TINYINT: 0 a 255.
- SMALLINT: 0 a 65.535.
- MEDIUMINT: 0 a 16.777.215
- INT: 0 a 4.294.967.295.
- BIGINT: 0 a 18.446.744.073.709.551.615


En este contexto, si se insertasen 1.000.000 de registros por segundo, se requerirían más de 584.554 años para agotar la numeración de un BIGINT.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 27/06/2011 a las 06:13