sql >> Databáze >  >> RDS >> Mysql

Optimalizace dotazů MySQL napříč hierarchickými daty

Aniž byste strávili čas testováním, poskytli jste neúplný příklad? určitě byste měli zkusit změnit pořadí spojených stolů. Výstup Explain poskytuje nějaké informace, řekněme, že řazení podle key_len by mělo být heuristicky nejrychlejší. Domnívám se, že první tabulka, která má být filtrována, by měla být uvedena jako poslední pro případ, že by to optimalizátor nebyl schopen zjistit.

Řekněme tedy, že pořadí „c, v, k, u“ je nejlepší.

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' by naznačovalo pořadí 'c/u, k, v', ale to závisí na datech:

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
;

Doufám, že to pomůže.

AKTUALIZACE (vyhýbá se spojení 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. MySQL - rozložit/rozdělit vstup do uložené procedury

  2. Funkce AVG() v PostgreSQL

  3. Získejte celkový rekordní růst v průběhu času v mysql

  4. Kde mysql_ssl_rsa_setup získává soubory OpenSSL?