2010-05-27 16 views
8

Tengo que eliminar aproximadamente 10K filas de una tabla que tiene más de 100 millones de filas según algunos criterios. Cuando ejecuto la consulta, demora unos 5 minutos. Ejecuté un plan de explicación (la consulta delete convertida a select * ya que MySQL no admite explain delete) y encontré que MySQL usa el índice incorrecto.MySQL, eliminar e indizar índice

Mi pregunta es: ¿hay alguna manera de decirle a MySQL qué índice usar durante la eliminación? Si no, ¿qué puedo hacer? Seleccionar a la tabla temporal y luego eliminar de la tabla temporal?

+0

Asegúrese de tener una clave principal y de que la columna nombrada en la cláusula WHERE de su eliminación esté indexada. –

Respuesta

4

Hay index hint syntax. //ETA: sadly, not for deletes

ETA: ¿Has intentado con ANALYZE TABLE $mytable?

Si eso no funciona, creo que tiene 2 opciones: descartar el índice ofensivo antes de eliminarlo y recrearlo después. O UNE su tabla de eliminación a otra tabla en el índice deseado, que debería garantizar que se utiliza el índice deseado.

+1

Sí, pero, a mi entender, la sugerencia de índice no funciona para las instrucciones de eliminación. –

+0

@Manuel Darveau: ¡Drat! acaba de probarlo. Estás en lo correcto. – dnagirl

2

Nunca me he encontrado realmente con una situación en la que MySQL eligiera el índice incorrecto, sino que mi comprensión de cómo funcionaban los índices solía ser la causa.

Es posible que desee echa un vistazo a este libro: http://oreilly.com/catalog/9780596003067

Tiene una gran sección sobre cómo funcionan los índices y otras opciones de ajuste.

+0

+1, el libro abre los ojos a muchas cosas en las que nunca pensarías. – newtover

+0

Edición, dnagirl tiene razón sobre la sintaxis de la sugerencia de índice, no sabía que se puso en marcha. – UltimateBrent

+0

He visto a mysql elegir el índice incorrecto muchas veces. Para nosotros ocurre en una tabla grande (15M filas) que tiene muchos índices similares (15 índices). Tal vez un escenario loco --- hay una razón --- y se pone el índice incorrecto a menudo, incluso cuando el inde a elegir debe ser el PRIMARIO. –