IME, MySQL tidak bekerja dengan baik dalam mengoptimalkan sub-kueri - khususnya tampaknya tidak mengelola predikat-push.
Saya sedikit bingung tentang apa yang sebenarnya dimaksudkan untuk dikembalikan oleh kueri - terutama 'sub-induk'
Anda akan mendapatkan beberapa peningkatan dengan menempatkan left_id dan right_id ke dalam satu indeks.
Meskipun Anda juga akan mendapatkan beberapa peningkatan dengan membuka gulungan kueri ke dalam prosedur tersimpan, mengingat bahwa Anda tampaknya melintasi hampir seluruh kumpulan data setiap kali solusi yang lebih baik adalah dengan mendenormalisasi kedalaman pohon dan menyimpannya sebagai atribut untuk setiap simpul. Memang Anda tampaknya melintasinya setidaknya dua kali di kueri luar saja.
Namun saya perhatikan bahwa di akhir kueri:
HAVING depth > 0
AND depth <= 1
Yang pastinya sama dengan
HAVING depth=1
Yang kemudian memberikan cara yang sangat berbeda untuk mengoptimalkan kueri (mulai dengan mendapatkan semua node di mana right=left+1 untuk menemukan node tanpa anak dan mencari cara untuk memeriksa id kategori).