IME, MySQL không làm tốt trong việc tối ưu hóa các truy vấn phụ - đặc biệt là nó dường như không quản lý các vị từ đẩy.
Tôi hơi băn khoăn về những gì truy vấn thực sự nhằm mục đích trả về - đặc biệt là 'phụ huynh'
Bạn sẽ nhận được một số cải thiện bằng cách đặt left_id và right_id vào một chỉ mục duy nhất.
Mặc dù bạn cũng sẽ nhận được một số cải tiến bằng cách bỏ cuộn truy vấn vào một thủ tục được lưu trữ, vì dường như bạn đang duyệt qua gần như toàn bộ tập dữ liệu mỗi khi giải pháp tốt hơn sẽ là không chuẩn hóa độ sâu của cây và lưu trữ nó dưới dạng một thuộc tính cho mỗi nút. Thật vậy, dường như bạn đang duyệt qua nó ít nhất hai lần chỉ trong truy vấn bên ngoài.
Tuy nhiên, tôi nhận thấy rằng ở cuối truy vấn:
HAVING depth > 0
AND depth <= 1
Mà chắc chắn là điều tương tự như
HAVING depth=1
Sau đó, cung cấp một cách rất khác để tối ưu hóa truy vấn (bắt đầu bằng cách lấy tất cả các nút ở vị trí right =left + 1 để tìm các nút không có nút con và tìm cách kiểm tra id danh mục).