Pregunta

En MySQL, ¿es generalmente más rápido / más eficiente / escalable devolver 100 filas con 3 columnas o 1 fila con 100 columnas?

En otras palabras, al almacenar muchas claves = > pares de valores relacionados con un registro, ¿es mejor almacenar cada clave = > ¿par de valores en una fila separada con record_id como clave, o para tener una fila por record_id con una columna para cada clave?

Además, suponga también que las claves deberán agregarse / eliminarse con bastante regularidad, lo que supongo que afectaría la mantenibilidad a largo plazo del enfoque de muchas columnas una vez que la tabla se vuelva lo suficientemente grande.

Editar: para aclarar, por " de forma regular " Me refiero a la adición o eliminación de una clave una vez al mes o algo así.

¿Fue útil?

Solución

Nunca debe agregar o eliminar columnas de forma regular.

Otros consejos

http://en.wikipedia.org/wiki/Entity-Attribute-Value_model

Hay muchas cosas malas sobre este modelo y no lo usaría si hubiera alguna otra alternativa. Si no conoce la mayoría (excepto algunos campos personalizables por el usuario) de las columnas de datos que necesita para su aplicación, entonces necesita dedicar más tiempo al diseño y resolverlo.

Si sus claves están preestablecidas (conocidas en tiempo de diseño), entonces sí, debe colocar cada clave en una columna separada.

Si no se conocen en tiempo de diseño, debe devolver sus datos como una lista de pares clave-valor que luego debe analizar fuera del RDBMS .

Si está almacenando pares clave / valor, debe tener una tabla con dos columnas, una para la clave (haga de esta la PK para la tabla) y otra para el valor (probablemente no necesite ningún índice) . Recuerde, " La clave, toda la clave y nada más que la clave. & Quot;

En el enfoque de varias columnas, encontrará que la tabla crece sin límite porque la eliminación de la columna detendrá todos los valores y no querrá hacerlo. Hablo por experiencia aquí, después de haber trabajado en un sistema heredado que tenía una tabla con casi 1000 columnas, la mayoría de las cuales eran campos de bits. Finalmente, dejas de poder justificar la eliminación de cualquiera de las columnas porque alguien podría estar usándolo y la última vez que lo hiciste, tuviste trabajo hasta las 2 de la madrugada para volver a las copias de seguridad.

Primero: determine con qué frecuencia se debe acceder a sus datos. Si siempre es necesario recuperar los datos de una sola vez y la mayoría de ellos se utilizan, entonces considere almacenar todos los pares de claves como un valor serializado o como un valor xml. Si necesita hacer algún tipo de análisis complejo sobre esos datos y necesita los pares de valores, las columnas están bien, pero limítelas a los valores que sabe que necesitará para realizar sus consultas. En general, es más fácil diseñar consultas que usan una columna para un parámetro que una fila. También te resultará más fácil trabajar con los valores devueltos si están todos en una fila que muchos.

Segundo: separe los datos a los que accede con más frecuencia y colóquelos en su propia tabla y los otros datos en otra. Por cierto, 100 columnas son muchas, así que le recomiendo que divida sus datos en fragmentos más pequeños que serán más manejables.

Por último: si tiene datos que pueden cambiar con frecuencia, debe usar crear la columna (clave) en una tabla y luego usar su valor de clave numérica contra el cual almacenaría el valor de clave. Esto supone que usará la misma tecla más de una vez y que acelerará su búsqueda cuando vaya a buscar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top