IME, MySQL ist nicht gut darin, Unterabfragen zu optimieren - insbesondere scheint es keine Push-Prädikate zu verwalten.
Ich bin etwas verwirrt darüber, was die Abfrage eigentlich zurückgeben soll - insbesondere das 'Sub-Elternteil'
Sie würden einige Verbesserungen erzielen, indem Sie left_id und right_id in einen einzigen Index einfügen.
Während Sie auch eine gewisse Verbesserung erzielen, indem Sie die Abfrage in eine gespeicherte Prozedur ausrollen, wäre es eine bessere Lösung, die Baumtiefe zu denormalisieren und sie als Attribut für jeden Knoten zu speichern, da Sie scheinbar jedes Mal fast den gesamten Datensatz durchlaufen. Tatsächlich scheinen Sie es allein in der äußeren Abfrage mindestens zweimal zu durchlaufen.
Allerdings bemerke ich das am Ende der Abfrage:
HAVING depth > 0
AND depth <= 1
Was sicherlich dasselbe ist wie
HAVING depth=1
Dies bietet dann eine ganz andere Möglichkeit zur Optimierung der Abfrage (beginnen Sie damit, alle Knoten mit rechts =links + 1 zu erhalten, um die Knoten ohne untergeordnete Elemente zu finden, und arbeiten Sie sich den Weg zur Überprüfung der Kategorie-ID vor).