Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:zagnieżdżony zestaw jest wolny?

IME, MySQL nie radzi sobie dobrze z optymalizacją podzapytań - szczególnie wydaje się, że nie zarządza predykatami push.

Jestem trochę zdezorientowany co do tego, co zapytanie ma faktycznie zwrócić - szczególnie „podrzędny rodzic”

Uzyskasz pewną poprawę, umieszczając left_id i right_id w jednym indeksie.

Chociaż można również uzyskać pewną poprawę poprzez rozwinięcie zapytania do procedury składowanej, biorąc pod uwagę, że za każdym razem wydaje się, że przemierzasz prawie cały zestaw danych, lepszym rozwiązaniem jest denormalizacja głębokości drzewa i przechowywanie jej jako atrybutu dla każdego węzła. Rzeczywiście wydaje się, że przechodzisz to co najmniej dwa razy w samym zewnętrznym zapytaniu.

Zauważyłem jednak, że na końcu zapytania:

HAVING depth > 0
   AND depth <= 1

Co z pewnością jest tym samym, co

HAVING depth=1

Co z kolei zapewnia zupełnie inny sposób optymalizacji zapytania (zacznij od pobrania wszystkich węzłów, w których right=left+1, aby znaleźć węzły bez dzieci i przejdź dalej, aby sprawdzić identyfikator kategorii).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python mySQL - unikanie cudzysłowów

  2. Zapytanie Java MYSQL/JDBC zwraca nieaktualne dane z buforowanego połączenia

  3. MySQL przechowuje dane Float

  4. czy `data` jest prawidłową nazwą kolumny mysql?

  5. Dostęp do bazy danych za pomocą Angular