IME, MySQL no funciona bien en la optimización de subconsultas, en particular, no parece administrar predicados de inserción.
Estoy un poco confundido acerca de lo que la consulta realmente pretende devolver, particularmente el 'sub-principal'
Obtendría algunas mejoras si pusiera left_id y right_id en un solo índice.
Si bien también obtendrá algunas mejoras al convertir la consulta en un procedimiento almacenado, dado que parece estar recorriendo casi todo el conjunto de datos cada vez, una mejor solución sería desnormalizar la profundidad del árbol y almacenarla como un atributo para cada nodo. De hecho, parece estar atravesándolo al menos dos veces solo en la consulta externa.
Sin embargo, observo que al final de la consulta:
HAVING depth > 0
AND depth <= 1
Que seguramente es lo mismo que
HAVING depth=1
Lo que luego proporciona una forma muy diferente de optimizar la consulta (comience por obtener todos los nodos donde derecha =izquierda + 1 para encontrar los nodos sin hijos y trabaje en la forma de verificar la identificación de categoría).