sql >> Base de Datos >  >> RDS >> Mysql

MySQL define la columna como ÚNICA con AUTO_INCREMENT en lugar de como clave principal

Definición de MySQL sin explícito claves primarias es una idea muy, muy mala.
Si falta una PK, MySQL creará una clave primaria implícita (pero muy real) de incremento automático de enteros.
Esta PK se incluirá en cada clave secundaria en InnoDB y determinará su orden de clasificación principal en MyISAM.

Consecuencia
Acabas de ralentizar el rendimiento de cada selección, inserción y actualización.
Sin ningún propósito.

InnoDB:se requiere búsqueda adicional para llegar a los datos de la tabla
En InnoDB es necesario realizar una búsqueda adicional, ya que todos los índices secundarios se refieren al PK y no a las filas en sí.

MyISAM:espacio desperdiciado
En MyISAM, la penalización no es tan grande, pero todavía está arrastrando un campo de 4 bytes sin usar que no se usa.

InnoDB + MyISAM:Generación inútil de campo de autoincremento
Porque se crea un PK de incremento automático implícito, y también necesitaba una clave de incremento automático adicional para hacer uniones; Para evitar la duplicación de campos de incremento automático, ahora no tiene 1, sino 2 bloqueos de tabla por inserción.

InnoDB:con uniones, el problema de búsqueda mencionado anteriormente se duplica
Si realiza una unión utilizando un campo que no es el PK, InnoDB necesita realizar una búsqueda adicional por unión para llegar a los registros de esa otra tabla.

InnoDB:lo peor de todo es que pierde el beneficio de cubrir índices
Ha deshabilitado una de las mejores optimizaciones en InnoDB, que cubre los índices.
Si MySQL puede resolver la consulta usando solo los datos en los índices, nunca leerá la tabla, esto resultará en una velocidad significativa ganar. Ahora que el 50% de cada índice en InnoDB es espacio sin usar, acaba de eliminar sus posibilidades de que se use esa optimización.

¡Por favor, golpea a este contratista con un palo de pistas!

Enlaces:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (enlace lento, pero recomiendo leer).
O'Reilly sobre los índices de cobertura de InnoDB http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

Por cierto , si su contratista dice que no importa mucho porque está usando MyISAM, vuelva a vencerlo, siempre debe usar InnoDB a menos que tenga una buena razón para no hacerlo también.
InnoDB es mucho más seguro en producción, MyISAM tiene su utiliza pero se corrompe con demasiada facilidad.