¿Alguien puede decirme cómo agregar una clave escalas en MySQL? He 500,000,000 filas en una base de datos, trans, con columnas i (INT UNSIGNED), j (INT UNSIGNED), nu (DOBLE), UNA (DOBLE).
Trato de índice de una columna, por ejemplo,

ALTER TABLE trans ADD KEY idx_A (A);

y espero. Para una tabla de 14,000,000 filas que tomó cerca de 2 minutos para que se ejecuten en mi MacBook Pro, pero para el conjunto de la mitad de mil millones, es tomar las 15hrs y contando. Estoy haciendo algo mal, o solo estoy siendo ingenuo acerca de cómo la indexación de una base de datos de las escalas con el número de filas?

  • es posible que desee buscar en la división de datos ( base de datos sharding ) la tabla
InformationsquelleAutor xnx | 2010-03-20

4 Comentarios

  1. 37

    Hay un par de factores a considerar:

    • La clasificación es un N. log(N) de la operación.
    • El tipo de 14M filas bien podría caber en la memoria principal; el tipo con 500M de filas probablemente no, por lo que la ordenación de los derrames en el disco, lo que hace que las cosas enormemente.

    Ya que este factor es de alrededor de 30 en tamaño, el nominal de la ordenación del tiempo para el gran conjunto de datos sería del orden de 50 veces más tiempo – menos de dos horas. Sin embargo, usted necesita 8 bytes por valor de datos y otro de 8 bytes de sobrecarga (que es una conjetura – tune para mySQL si usted sabe más acerca de lo que se almacena en un índice). Así, DE 14 × 16 ≈ 220 MB de memoria principal. Pero de 500 m × 16 ≈ 8 GB de memoria principal. A menos que su máquina tiene esa cantidad de memoria libre (y MySQL está configurado para utilizarlo), entonces la gran tipo se está extendiendo en el disco y que representa una gran parte del resto del tiempo.

    • Muchas gracias, que tiene sentido para mí – solo tengo 4 GB. Se parece a la división (partición?) los datos como se sugirió anteriormente, hace un montón de sentido.
    • hizo dividir su mesa? ¿cuánto tiempo le tomó?
  2. 6

    En primer lugar, su definición de la tabla podría hacer una gran diferencia aquí. Si usted no necesita NULL valores en las columnas, los definen NOT NULL. Esto le ahorrará espacio en el índice, y, presumiblemente, el tiempo, mientras que la creación de la.

    CREATE TABLE x ( 
      i INTEGER UNSIGNED NOT NULL, 
      j INTEGER UNSIGNED NOT NULL, 
      nu DOUBLE NOT NULL, 
      A DOUBLE NOT NULL 
    );

    Como por el tiempo tomado para crear los índices, esto requiere un examen de la tabla y se muestran como REPAIR BY SORTING. Debería ser más rápido en su caso (es decir, la enorme conjunto de datos) para crear una nueva tabla con los índices e insertar los datos en ella, ya que esto evitará el REPAIR BY SORTING operación como la que se construyen los índices de forma secuencial en el inserto. No es un concepto similar al explicado en este artículo.

    CREATE DATABASE trans_clone;
    CREATE TABLE trans_clone.trans LIKE originalDB.trans;
    ALTER TABLE trans_clone.trans ADD KEY idx_A (A);

    A continuación, la secuencia de comandos insertar en trozos (según el artículo), o el volcado de los datos mediante MYSQLDUMP:

    mysqldump originalDB trans  --extended-insert --skip-add-drop-table --no-create-db --no-create-info > originalDB .trans.sql
    mysql trans_clone < originalDB .trans.sql

    Esto va a insertar los datos, pero no requiere la reconstrucción del índice (el índice se construye como cada fila es insertada) y debe completar mucho más rápido.

    • Tenga en cuenta que en lugar de hacer un mysqldump y una restauración que requeriría al menos una mesa continua de bloqueo de lectura para la duración del proceso, puede usar pt-online-esquema de cambio de la Percona kit de herramientas – se haría cargo de la creación y copia de datos en varios pases, quitar el continuo bloqueo requisito.
  3. 2

    De mi experiencia: si el hardware puede hacer frente a ella, la indexación de grandes tablas con MySQL generalmente escala bastante lineal. He probado con las mesas de alrededor de 100.000.000 de filas hasta ahora, pero no en un cuaderno de notas – principalmente en la fuerte servidores.

    Supongo que depende principalmente de hardware factores, el tipo de tabla motor está utilizando (MyIsam, INNO, o lo que sea) y un poco si la tabla está en uso en el medio. Cuando lo estaba haciendo, generalmente de uso de disco saltó alto cielo, a diferencia de uso de CPU. No estoy seguro acerca de los discos duros de los ordenadores MacBook, pero supongo que no son los más rápidos alrededor.

    Si tienes tablas MyISAM, tal vez tener una mirada más cercana en el índice de los archivos en el directorio de la tabla y ver cómo cambia con el tiempo.

    • Gracias por la rápida respuesta,Björn. He seguido tu sugerencia. Yo tome los archivos #sql-a8_6.MYD (actualmente 7,455,506,432 bytes) y #sql-a8_6.MYI (actualmente 2,148,865,024 bytes) son la nueva versión de la base de datos de construcción y el índice me pidió respectivamente? Entonces, si la tabla original es trans.MYD (12,645,156,375 bytes), yo estoy cerca de 60% hacer? Está empezando a parecer estaría mejor fuera de la división de la enorme mesa en 20 o menos en tablas. Gracias, Christian
    • En general eso debe ser. Bueno, todo depende de lo que quieras hacer con esa cantidad de datos. 500.000.000 filas son un montón, así que si quieres hacer algo de fantasía informes después, intentar minimizar los datos. Intentar dividir, o tomar un botín en MySQLs partición características (a partir de la versión 5.1).
  4. 0

    Así que teóricamente si la Clasificación de paso es un N. log(N) de la operación, partitionning su gran tabla de ahorrar tiempo en la operación de

    Alrededor de 30 % de ganancia para una tabla de 500 000 000 filas partitionned en 100 igualdad de archivos : porque
    500 000 000* registro de(500 000 000)= 4 349 485 002
    y
    100 *(500 000 000/100*REGISTRO de(500 000 000/100)) = 3 349 485 002

Dejar respuesta

Please enter your comment!
Please enter your name here