2008-12-13 17 views
5

Me preguntaba si InnoDB sería la mejor forma de formatear la tabla? La tabla contiene un campo, clave principal, y la tabla obtendrá 816k filas por día (est.). ¡Esto se hará muy grande muy rápido! Estoy trabajando en una forma de almacenamiento de archivos (¿sería esto más rápido)? ¿La tabla va a almacenar números de ID de Twitter Ids que ya se han procesado?Clave principal grande: 1+ mil millones de filas MySQL + InnoDB?

Además, ¿cualquier uso de memoria estimado en una declaración SELECT min('id')? ¡Cualquier otra idea es muy apreciada!

+0

¿Puede proporcionarnos algunos detalles sobre cómo se accederá a los datos? –

Respuesta

2

La única respuesta definitiva es probar ambos y probar y ver qué pasa.

En general, MyISAM es más rápido para escribir y leer, pero no ambos al mismo tiempo. Cuando escribe en una tabla MyISAM, toda la tabla se bloquea para que se complete la inserción. InnoDB tiene más sobrecarga pero usa bloqueo a nivel de fila para que las lecturas y escrituras puedan ocurrir simultáneamente sin los problemas en los que incurre el bloqueo de tabla de MyISAM.

Sin embargo, su problema, si lo entiendo correctamente, es un poco diferente. Tener solo una columna, esa columna como clave principal tiene una consideración importante en las diferentes formas en que MyISAM e InnoDB manejan los índices de clave primaria.

En MyISAM, el índice de clave principal es como cualquier otro índice secundario. Internamente, cada fila tiene una identificación de fila y los nodos de índice solo apuntan a los identificadores de fila de las páginas de datos. Un índice de clave principal no se maneja de manera diferente que cualquier otro índice. En InnoDB, sin embargo, las claves principales están agrupadas, lo que significa que permanecen adjuntas a las páginas de datos y aseguran que el contenido podría estar disperso en cualquier orden.)

En este caso, esperaría que InnoDB pudiera tener una ventaja en cuanto a que MyISAM tendría que hacer un doble trabajo: escribir el número entero una vez en las páginas de datos y luego escribirlo de nuevo en las páginas de índice. InnoDB no haría esto, el índice de clave principal sería idéntico a las páginas de datos, y solo tendría que escribir una vez. Solo tendría que administrar los datos en un solo lugar, donde MyISAM tendría que administrar innecesariamente dos copias.

Para cualquier motor de almacenamiento, hacer algo como min() o max() debe ser trivial en una columna indexada, o simplemente verificar la existencia de un número en el índice. Como la tabla es solo una columna, ninguna búsqueda de marcadores sería necesaria, ya que los datos se representarían por completo en el índice mismo. Este debería ser un índice muy eficiente.

Yo tampoco estaría tan preocupado por el tamaño de la mesa. Cuando el ancho de una fila es solo un entero, puede ajustar una gran cantidad de filas por página de índice/datos.

1

Si estos números de ID aumentan monótonamente y sus escrituras solo anexan datos (nunca los modifique), probablemente será mucho más rápido usar un solo archivo. A SELECT min('id') luego se convierte en leer la primera línea del archivo, y cualquier otra cosa es una búsqueda binaria.

6

Recomiendo que inicie partioning su tabla por ID o fecha. Partioning divide una tabla grande en varias tablas más pequeñas de acuerdo con una lógica definida (como dividirla por rangos de fechas), lo que las hace mucho más manejables en cuanto a rendimiento y memoria. MySQL 5.1 tiene esta función incorporada, o puede implementarla usando soluciones personalizadas.

Al implementar el almacenamiento en un archivo plano, pierde todas las ventajas de una base de datos: ya no puede realizar consultas que involucren los datos.

0

Si tiene un índice en su columna de identificación, seleccione min (id) debería ser O (1), no debería haber una gran cantidad de memoria requerida para esto.

Si su clave principal está en la identificación de twitter, entonces tiene un índice.

0

Con un solo campo, siendo la clave principal, solo agregando registros, esto no es realmente adecuado para una base de datos normal.

Para empezar, está almacenando el doble de información que necesita, y cada campo va a la tabla de datos y al índice.

Como nota aparte, la base de datos relacional se llama así porque, por un lado, almacenan datos relacionados en una sola fila; es difícil ver cómo califica tu información :-) Si estuvieras almacenando otras cosas también, una base de datos valdría la pena.

No menciona si se accederá a los datos por múltiples procesos a la vez; de lo contrario, no necesita todas las ventajas conferidas por los principios ACID de la base de datos. Incluso si desea ACID, eso aún se puede lograr sin una base de datos completa.

Mi primer pensamiento sería construir tu propio árbol B o archivo de datos B + -árbol para almacenar los ID de twitter para evitar la duplicación de datos. Las únicas consultas que le veo hacer (basado en la pregunta) son:

  • seleccione min (id) from tbl; y
  • seleccionar id de tbl donde id =?

El primero se puede hacer O (1) simplemente almacenando el más bajo en otro archivo fuera de la estructura del árbol B (y reemplazándolo cuando se obtiene uno más bajo). No estoy seguro del caso de negocio para este, a menos que sea para descubrir rápidamente que cierta ID de Twitter no está en la tabla (por lo que probablemente también desee el máximo en ese caso).

La segunda son las técnicas estándar de búsqueda de árbol, que es lo que una base de datos generalmente utiliza bajo las cubiertas de todos modos.

+0

bueno, necesito llenar los vacíos en la tabla si los hay, lo cual es más fácil con mysql porque los datos se completarán con varios guiones –

0

También he visto que algunas firmas comerciales usan la base de datos tick, es decir. kdb + http://kx.com/

Cuestiones relacionadas