¿Cómo gestionar millones de usuarios?


17

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? jay@mail.com 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 .
NimChimpsky

55
Si planea tener una gran cantidad de usuarios y una gran cantidad de datos, debe contratar a un especialista en bases de datos para diseñar eso. No miraría a nadie que no tenga al menos diez años de experiencia en bases de datos y al menos 5 años de gran experiencia en diseño de bases de datos. Esta es una asignatura compleja que requiere un amplio conocimiento.
HLGEM

Respuestas:


30

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.


44
Be fast to launch and find the problems as they comeEsta parte es excelente. Es verdad. Si encontramos problemas a medida que surgen, no habrá ningún problema serio en momentos posteriores. +1
ALH

16

No 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:

RANGO de particionamiento. Este tipo de particionamiento asigna filas a particiones basadas en valores de columna que se encuentran dentro de un rango dado. Consulte la Sección 18.2.1, “Particionamiento de RANGO”.

LISTA particionamiento. Similar a la partición por RANGE, excepto que la partición se selecciona en base a columnas que coinciden con uno de un conjunto de valores discretos. Consulte la Sección 18.2.2, “Particionamiento LISTA”.

Particionamiento HASH . Con este tipo de particionamiento, se selecciona una partición en función del valor devuelto por una expresión definida por el usuario que opera en valores de columna en filas para insertar en la tabla. La función puede consistir en cualquier expresión válida en MySQL que produzca un valor entero no negativo. También está disponible una extensión para este tipo, LINEAR HASH. Consulte la Sección 18.2.3, “Particionamiento HASH”.

Particionamiento CLAVE . Este tipo de particionamiento es similar al particionamiento por HASH, excepto que solo se suministran una o más columnas a evaluar, y el servidor MySQL proporciona su propia función de hashing. Estas columnas pueden contener valores distintos a los enteros, ya que la función de hash proporcionada por MySQL garantiza un resultado entero independientemente del tipo de datos de la columna. También está disponible una extensión para este tipo, LINEAR KEY. Consulte la Sección 18.2.4, “Particionamiento CLAVE”.


7

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 useresquema de tabla en el archivo user.install .


3

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.


-3

¿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.


9
Esta es una super mala idea. Por ejemplo, su software tendrá que migrar automáticamente las filas si los usuarios cambian el apellido ... a menos que deje de preocuparse por la coherencia. Esta estrategia invita a ese tipo de contingencias.
randomx
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.