Es mejor crear una tabla para cada cuenta de usuario, o una tabla enorme para todos los datos de usuario en MYSQL

8

Estoy creando un directorio web que permitirá a los usuarios individuales registrarse para obtener una cuenta y almacenar esencialmente documentos de texto en una entrada de base de datos mysql.

Inicialmente, probablemente habrá solo unos pocos cientos de usuarios, pero esperamos tener de 10,000 a 100,000 en algún momento. Y cada usuario podría cargar 100-200 "documentos".

¿Sería más eficiente crear una tabla masiva, indexada por un número de usuario? Que teóricamente podría llegar a ser 20,000,000 de entradas. ¿O seguir adelante y crear una tabla para cada usuario con sus documentos individuales?

Supongo que no es saludable tener miles de tablas en una base de datos, pero realmente no puedo encontrar ningún dato concreto sobre esto.

Keith
fuente

Respuestas:

7

MySQL puede hacer frente fácilmente a filas de 20 millones si está indexado correctamente. Tenemos tablas con más de mil millones de filas.

Tener una mesa es más limpio. No es necesario hacer magia en la aplicación basada en el usuario (nombre). También es más fácil hacer estadísticas en la tabla de documentos.

Definitivamente iría con el enfoque de una gran mesa. Si le preocupa el tamaño de la tabla (física), debería considerar la partición de la tabla de documentos. http://dev.mysql.com/doc/refman/5.5/en/partitions-types.html

Károly Nagy
fuente
Gracias por la respuesta. Definitivamente iré con una sola tabla, e investigaré el enfoque de partición. Una pregunta, sin embargo, ¿qué se entiende exactamente por una tabla correctamente indexada? Escuché que se hace mucha referencia a esto, y supongo que significa que la tabla de la base de datos necesita una clave de índice correctamente definida. Pero hay algo más que eso para la mejor optimización.
Keith el
Con indexado correctamente, me refería a tener al menos un índice compuesto en user_id con las columnas por las que está filtrando u ordenando en la tabla de documentos e indexar en el nombre de usuario en la tabla de usuarios (probablemente un índice parcial es suficiente para verificar la cardinalidad 90-95 % es suficiente). Por ejemplo: sqlfiddle.com/#!2/9fb15/2 (en mi caso con el índice parcial 5 en la cardinalidad del nombre de usuario es 50%)
Károly Nagy
Creo que entiendo, gracias por la ayuda. Una pregunta más, suponiendo que tenga una clave de índice principal para cada tabla, ¿sigue siendo útil para la optimización definir columnas adicionales que sabe que buscará regularmente (como la categoría principal) como índice? ¿Existe una desventaja en la definición de una clave primaria o única y de 2 a 4 índices para cada tabla?
Keith el
Los índices ayudarán, sí. En realidad, siempre debe tener índices en las columnas en las que está filtrando; de lo contrario, la consulta terminará en una búsqueda de exploración completa. El único inconveniente (además del tamaño del índice) son las inserciones y actualizaciones más lentas, sin embargo, ya que 5.1 con el complemento InnoDB y 5.5 por defecto, MySQL tiene una rápida creación de índice ( dev.mysql.com/doc/refman/5.5/en/… ) por lo que no Un gran problema más.
Károly Nagy