sql >> Database >  >> RDS >> Mysql

MySQL-query's optimaliseren voor hiërarchische gegevens

Zonder tijd te besteden aan het testen, heb je een onvolledig voorbeeld gegeven? Je moet zeker proberen opnieuw ordenen van samengevoegde tabellen. Explain output geeft wat informatie, laten we zeggen dat bestellen op key_len heuristisch het snelst zou moeten zijn. De eerste tabel waarop moet worden gefilterd, moet als laatste worden vermeld voor het geval de optimizer dat niet kan achterhalen, geloof ik.

Dus laten we zeggen dat de volgorde 'c, v, k, u' de beste is.

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
;

'rows' zou de volgorde 'c/u, k, v' suggereren, maar dat hangt af van de gegevens:

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
;

Ik hoop dat dit helpt.

UPDATE (vermijd de varchar-join):

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. Correcte indexering bij gebruik van OR-operator

  2. Kolomrechten toepassen voor een tabel via een trigger

  3. Het niet-vastgelegde isolatieniveau lezen

  4. SSL of TLS inschakelen in Oracle Apps R12