La creación de índices es esencialmente una operación de clasificación , por lo que, en el mejor de los casos, tiene una complejidad de crecimiento del orden n log n
en promedio (es posible que en algunos casos lo haga mejor y no sea mucho peor).
Si todas sus páginas de datos relevantes se ajustan a la RAM y ya están en la RAM, y el índice también se ajustará, y su DBMS no obliga a escribir las páginas de índice antes de que se complete la creación (por lo que los bloques de índice no se actualizan en el disco varias veces durante la operación), entonces la velocidad de escritura del índice resultante en el disco será más significativa que el tiempo necesario para realizar la clasificación, por lo que es posible que se acerque a una relación lineal entre el número de filas y el tiempo que lleva la creación del índice. ¡pero si asume el peor de los casos, es menos probable que se sorprenda desagradablemente!
Recuerde que a menos que no vaya a detener el acceso a la base de datos de producción durante la operación, cualquier creación de índice competirá por el ancho de banda de E / S y / o bloqueos con otra actividad, por lo que debe intentar tener esto en cuenta si está haciendo sus pruebas de estimación de tiempo en otro sistema incluso si está configurado de forma idéntica.
Si se hiciera esta pregunta hace unos 6 años, habría dicho enfáticamente que NO, ya que se refería a MySQL 4.x. Sin embargo, MySQL 5.x realiza la creación de índices linealmente hoy. Acabo de tener una experiencia nostálgica al explicar esto en mi respuesta a esa pregunta anterior.
fuente
Depende.
Variable n. ° 1: Si MySQL elige construir los índices sobre la marcha, o esperar hasta que todos los datos estén disponibles, haga una ordenación, etc., para construir el índice. Nota: los índices ÚNICOS (creo) deben construirse sobre la marcha para que se pueda verificar la UNICIDAD. La CLAVE PRIMARIA para InnoDB se almacena con los datos (o podría decirlo al revés), por lo que DEBE construirse aleatoriamente.
Variable n. ° 2: el índice rastrea los datos (por ejemplo, AUTO_INCREMENT o marca de tiempo) versus aleatorio (GUID, MD5), o en algún punto intermedio (número de parte, nombre, id_amigo).
Variable n. ° 3 (si el índice se crea sobre la marcha): el índice puede caber en la memoria caché (key_buffer o innodb_buffer_pool), o puede derramarse en el disco.
Los índices que rastrean los datos son eficientes y prácticamente lineales, independientemente de la respuesta al # 1.
Los identificadores aleatorios son un dolor. Si el índice no cabe en la memoria caché, el tiempo para construirlo será mucho peor que el lineal, independientemente de las otras variables. (No estoy de acuerdo con Rolando en este caso). Una enorme tabla de InnoDB con un GUID para la PK es dolorosamente lenta para INSERTAR en el plan en 100 filas / seg para discos ordinarios; quizás 1000 si tienes SSD. CARGAR DATOS e INSERTOS por lotes no lo llevará más allá de la lentitud del almacenamiento aleatorio.
3.53 a 5.6: no ha cambiado mucho.
Husillos múltiples? El trazado de bandas RAID es mejor en casi cualquier situación que asignar manualmente esto aquí y aquello allí. La división manual conduce a situaciones desequilibradas: una exploración de tabla está atascada en el disco de datos; una operación de solo índice está atascada en el disco de índice; una consulta solitaria golpea primero el disco índice, luego el disco de datos (sin superposición); etc.
fuente