vistas una soporta segundo rendimiento rapida por para optimizar mas lentas hacer grandes datos cuantas consultas consulta como cantidades mysql indexing twitter large-data-volumes

una - optimizar consultas mysql explain



Clave principal grande: 1+ mil millones de filas MySQL+InnoDB? (7)

Si estos números de ID aumentan monótonamente y sus escrituras solo añaden 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.

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?

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


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

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


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 un lado, 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 intento sería construir tu propio archivo de árbol B o árbol B + para almacenar los ID de twitter para evitar la duplicación de datos. Las únicas consultas que puedo verte hacer (basado en la pregunta) son:

  • seleccione min (id) de 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 es la técnica estándar de búsqueda de árboles, que es lo que generalmente utiliza una base de datos bajo las cubiertas.



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

Sin embargo, en InnoDB, las claves primarias se agrupan, lo que significa que permanecen adjuntas a las páginas de datos y aseguran que el contenido de las filas permanezca ordenado físicamente en el disco de acuerdo con la clave principal (pero solo dentro de las páginas de datos individuales, que pueden estar dispersas). cualquier orden.)

Siendo este el caso, esperaría que InnoDB pudiera tener una ventaja en cuanto a que MyISAM esencialmente 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 () debería 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.


Te recomiendo que comiences a dividir tu mesa 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.


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