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

Optymalizacja zapytań MySQL w danych hierarchicznych

Nie poświęcając czasu na testowanie, podałeś niekompletny przykład? zdecydowanie powinieneś spróbować zmienić kolejność połączonych stołów. Wyjaśnij wyjście dostarcza pewnych informacji, powiedzmy, że zamawianie przez key_len powinno być heurystycznie najszybsze. Pierwsza tabela do przefiltrowania powinna być wymieniona jako ostatnia na wypadek, gdyby optymalizator nie był w stanie tego rozgryźć.

Powiedzmy, że kolejność c, v, k, u jest najlepsza.

SELECT DISTINCT
  `v`.`key`,
  `u`.`val`
FROM
  `VertexDictionary`  AS `u`
  JOIN `SpecialKeys`       AS `k` ON (`k`.`x`, `k`.`key`) = (`u`.`x`, `u`.`key`)
  JOIN `VertexDictionary`  AS `v`
  JOIN `ConnectedVertices` AS `c` ON (`u`.`x`, `u`.`y`  ) = (`c`.`tail_x`, `c`.`tail_y`)
           AND (`v`.`x`, `v`.`y`  ) = (`c`.`head_x`, `c`.`head_y`)
WHERE
  `v`.`x` = X
;

„wiersze” sugerowałyby kolejność „c/u, k, v”, ale to zależy od danych:

SELECT DISTINCT
  `v`.`key`,
  `u`.`val`
FROM
  `VertexDictionary`  AS `u`
  JOIN `VertexDictionary`  AS `v`
  JOIN `SpecialKeys`       AS `k` ON (`k`.`x`, `k`.`key`) = (`u`.`x`, `u`.`key`)
  JOIN `ConnectedVertices` AS `c` ON (`u`.`x`, `u`.`y`  ) = (`c`.`tail_x`, `c`.`tail_y`)
                                 AND (`v`.`x`, `v`.`y`  ) = (`c`.`head_x`, `c`.`head_y`)
 WHERE
  `v`.`x` = X
;

Mam nadzieję, że to pomoże.

AKTUALIZUJ (unikanie przyłączenia varchar):

SELECT DISTINCT
  `v`.`key`,
  `u`.`val`
FROM
       `ConnectedVertices` AS `c`
  JOIN `VertexDictionary`  AS `u` ON (`u`.`x`, `u`.`y`  ) = (`c`.`tail_x`, `c`.`tail_y`)
  JOIN `VertexDictionary`  AS `v` ON (`v`.`x`, `v`.`y`  ) = (`c`.`head_x`, `c`.`head_y`)
WHERE
  (`u`.`x`, `u`.`key`) IN (SELECT `k`.`x`, `k`.`key` FROM `SpecialKeys` AS `k`)
AND
  `v`.`x` = X
;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - procedura składowana zwraca nieoczekiwaną wartość

  2. Zarządzanie kontami użytkowników, role, uprawnienia, uwierzytelnianie PHP i MySQL

  3. Przenoszenie i tworzenie kopii zapasowych dużej bazy danych MySQL

  4. NA ZDUPLIKOWANY KLUCZ + AUTO INCREMENT problem mysql

  5. Zapytanie SQL z danymi binarnymi (PHP i MySQL)