Pregunta

Estoy trabajando en un proyecto que es similar en naturaleza al análisis de visitantes del sitio web. Será utilizado por cientos de sitios web con un promedio de 10.000 a 100.000 páginas vistas por día, por lo que la cantidad de datos será muy grande.

¿Debo usar una sola tabla con websiteid o una tabla separada para cada sitio web?

Hacer un cambio en un servicio en vivo con cientos de sitios web con tablas separadas para cada uno parece ser un gran problema. Por otro lado, el rendimiento y la escalabilidad probablemente serán un problema con datos tan grandes. Cualquier sugerencia, comentario o consejo es bienvenido.

¿Fue útil?

Solución

¿Qué tal una tabla particionada por sitio web FK?

Otros consejos

Yo diría que use el diseño que tenga más sentido teniendo en cuenta sus datos, en este caso, una tabla grande.

Todos los registros serán del mismo tipo, con las mismas columnas, por lo que desde el punto de vista de la normalización de la base de datos tienen sentido tenerlos en la misma tabla. Un índice facilita la selección de filas particulares, especialmente cuando las consultas completas pueden ser satisfechas por datos en un solo índice (lo que a menudo puede ser el caso).

Tenga en cuenta que el análisis de visitantes implicará necesariamente una gran cantidad de operaciones en las que no existe otra forma fácil de optimizar que operar en un gran número de filas a la vez, por ejemplo: conteos, sumas y promedios. Es típico que las estadísticas intensivas de recursos como ésta se calculen previamente y se almacenen, en lugar de buscarlas en vivo. Es algo en lo que querrías pensar.

Si los datos son uniformes, vaya con una tabla. Si alguna vez necesitas SELECCIONAR en todos los sitios web tener varias mesas es un dolor. Sin embargo, si escribe suficientes secuencias de comandos, puede hacerlo con varias tablas.

Puede usar el motor de almacenamiento MERGE de MySQL para realizar SELECT en todas las tablas (pero no espere un buen rendimiento, y tenga cuidado con el límite de Windows en la cantidad de archivos abiertos. En Linux puede usar ulimit para aumentar el límite. No hay manera de hacerlo en Windows).

He dividido una tabla enorme en muchas (cientos) de tablas y usé MERGE para SELECCIONAR. Hice esto para poder realizar la creación y optimización fuera de línea de cada una de las tablas pequeñas. (Ej. OPTIMIZAR o ALTERAR LA TABLA ... ORDENAR POR) Sin embargo, el rendimiento de SELECT con MERGE hizo que escribiera mi propio motor de almacenamiento personalizado. (Descrito http://blog.coldlogic.com/categories/coldstore/'>here)

Utilice la estructura de datos única. Una vez que comienza a tener problemas de rendimiento, hay muchas soluciones, como puede particionar sus tablas por la identificación del sitio web, también conocida como partición horizontal, o también puede usar la replicación. Todo esto depende de la proporción de lecturas frente a escrituras.

Pero para empezar, mantenga las cosas simples y use una tabla con la indexación adecuada. También puede determinar si necesita transacciones o no. También puede aprovechar varios motores de almacenamiento mysql diferentes como MyIsam o NDB (en la agrupación de memoria) para aumentar el rendimiento. El almacenamiento en caché también juega un papel muy bueno en la descarga de la carga de la base de datos. Los datos que en su mayoría son solo de lectura y se pueden calcular fácilmente, generalmente se colocan en el caché y el caché atiende la solicitud en lugar de ir a la base de datos y solo las consultas necesarias van a la base de datos.

Use una tabla a menos que tenga problemas de rendimiento con MySQL.

Aquí nadie puede responder a las preguntas de rendimiento, solo debes hacer las pruebas de rendimiento para comprender si tener una sola mesa grande es suficiente.

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