Estoy a punto de lanzar algo realmente grande. Necesito preparar mi servidor y base de datos.
Me gustaría agrupar cada conjunto de 100.000 usuarios en tablas de usuario separadas, pero no sé cómo asociar a un usuario que intenta iniciar sesión en la tabla de usuario adecuada.
Por ejemplo, ¿cómo conocería a ese usuario? [email protected]
está relacionado con la tabla de usuarios # 36?
¿Sería lo mismo tener 10 millones de usuarios en una tabla de usuarios o 100 de 100,000?
¿Cómo funciona Facebook? No puedo creer que tendrían una tabla de usuario global con 950 millones de entradas.
I can't believe they would have one global user table with 950 million entries.
Puedo, no es tan grande. He trabajado con mesas más grandes. Es bastante común. La otra opción que consideraría si tiene muchos otros datos es una base de datos NoSQL .Respuestas:
Mañana no tendrá mil millones de usuarios y MySQL puede manejar varios millones de filas sin ningún problema. Tengo 5 millones de usuarios en mi tabla de usuarios y confía en mí, ni siquiera está en mi radar de cosas por las que preocuparme.
No se preocupe por fragmentar hasta que necesite hacerlo. Está intentando optimizar prematuramente un problema que puede existir o no, y en el proceso, paralizará severamente la velocidad a la que puede innovar. Sea rápido para iniciar y encuentre los problemas a medida que surjan. No puede predecir de antemano cuáles serán sus desafíos de escala.
Cuando llegue a esta escala y, si alguna vez, tendrá un poco de dinero y recursos para arrojar a este tipo de problema.
fuente
Be fast to launch and find the problems as they come
Esta parte es excelente. Es verdad. Si encontramos problemas a medida que surgen, no habrá ningún problema serio en momentos posteriores. +1No estoy seguro de si los consultores externos serían el mejor soporte para su empresa si va a manejar conjuntos de datos realmente grandes y necesita comenzar desde cero. Por favor, no me malinterpreten, pero si uno arruina un proyecto con tantos clientes, tendrá un impacto de relaciones públicas en su empresa.
Con respecto a las 10 millones de tuplas en una tabla, si tiene una buena indexación, estará bien. Necesitamos almacenar varias tuplas de 100M en una tabla aquí (artículos vendidos) que funciona bien en un gran oráculo 11g
Aquí hay una publicación de 2010 con un mapa de diseño de base de datos de Facebook : diseño de la base de datos de Facebook
Es posible que desee leer la documentación de mysql sobre tipos de particiones como esta: Documentación de MySQL: Particionamiento
MySQL admite estos tipos:
fuente
En primer lugar, no separe a los usuarios en tablas separadas. Hará las cosas complejas e inútiles. Las bases de datos como MySQL y otras pueden funcionar con las bases de datos de millones de registros en la misma tabla sin ningún problema (con las CLAVES PRIMARIAS correctas configuradas). Utilice el campo de clave única AUTO_INCREMENT AND PRIMARY de la base de datos para cada usuario (en la tabla de usuario principal), de modo que cada registro sea único (UID). Luego, en las otras tablas, está haciendo referencia a esa identificación única. Luego, asegúrese de que en cada tabla que tenga configurada como PRIMARY KEY, acelerará el procesamiento de la información en el servidor de la base de datos. Puede aprender de Drupal CMS cómo está almacenando la información del usuario. Probado en más de 10 años por millones de usuarios y empresas muy grandes (utilizado por grandes empresas de medios, el gobierno, incluso los bancos más grandes del mundo). En www.drupal. org encontrará más de 1,6 millones de páginas (nodos) almacenadas en la misma tabla y tiene más de un millón de visitantes únicos por mes y el sitio web funciona sin fallas. Todo se trata de la optimización y configuración adecuadas.
Después de 10 millones de registros, si no está satisfecho con el rendimiento (después de la optimización adecuada y los cambios de configuración de db), puede decidir si realmente desea separar a los usuarios por diferentes tablas. Por lo tanto, puede ampliar la funcionalidad agregando una nueva tabla que tenga información sobre dónde se guardan los registros de los usuarios: UID y nombre_tabla. Luego, en cualquiera de las otras tablas, solicite esta información, esta tabla buscará la tabla correcta. Pero realmente le aconsejo que tenga una gran tabla para los usuarios, a menos que tenga más de 10-100 millones de registros. Pero no mejorará mucho el rendimiento (las bases de datos están diseñadas para manejar la gran cantidad de datos). Es mejor mantener la información simple. Por lo general, las empresas simplemente deciden por otro servidor de base de datos (maestro y esclavo), y otro, y luego ' estamos trabajando juntos con la funcionalidad de equilibrio de carga. Si tiene esos 10 millones de usuarios, podría pagar por otro servidor db, ¿verdad?
Vea el ejemplo de
user
esquema de tabla en el archivo user.install .fuente
Como sugieren las otras respuestas, no es una buena idea dividir a los usuarios en varias tablas. La mayoría de las bases de datos con índices en el ID de usuario pueden manejar millones de filas. Sin embargo, la latencia por consulta puede aumentar dependiendo del número total de entradas en el índice. Siempre que el conjunto de datos sea pequeño, puede administrar con una sola tabla en bases de datos normales.
Trataré de incluir una idea diferente también para su consideración futura si creces mucho más allá de un millón de registros más o menos. Con una cantidad tan grande de clientes, no desea ningún tiempo de inactividad, etc. Por lo tanto, hay un montón de bases de datos nosql que es posible que desee ver. Harán el fragmentación por usted en lugar de que usted mismo administre la fragmentación desde la aplicación. También darán redundancia de datos y, por lo tanto, más tiempo de actividad. Facebook y todos usan mucho memcache, etc. para su caché. Pero no estoy seguro de lo que usan para su tienda permanente.
Una cosa importante que debe tener en cuenta es que no puede hacer combinaciones, etc. con las bases de datos nosql. Por lo tanto, planifique su caso de uso y decida. Si las uniones y las transacciones de registros múltiples son una necesidad para usted, las bases de datos nosql no lo son para usted.
fuente
¿Por qué no dividir según el rango alfabético? Si tendrá millones de usuarios, cree una tabla separada para cada letra o para un par de letras (tabla 'a' para usuarios con nombre de usuario que comienza con 'a'). Al principio será muy costoso, pero dado que espera una gran base de datos y desea poder distinguir qué tabla debe usarse para un usuario en particular, supongo que el orden alfabético es la opción más obvia y fácil.
fuente