sql >> Databasteknik >  >> RDS >> Mysql

Optimera MySQL-frågor över hierarkiska data

Utan att spendera tid på att testa det, gav du ett ofullständigt exempel? du borde definitivt försöka ordna om av sammanfogade bord. Explain output ger lite information, låt oss säga att beställning av key_len bör vara heuristiskt snabbast. Den första tabellen som ska filtreras på bör listas som den sista ifall optimeraren inte kan ta reda på det, tror jag.

Så låt oss säga att "c, v, k, u"-ordningen är den bästa.

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
;

'rader' skulle föreslå 'c/u, k, v' ordning, men det beror på data:

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
;

Hoppas detta hjälper.

UPPDATERA (undvika varchar-anslutningen):

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. SQL Server COALESCE() Förklarad

  2. SELECTING med flera WHERE-villkor i samma kolumn

  3. Hur kan jag ställa in en String[]-parameter till en inbyggd fråga?

  4. Vad är aktuell vy APPL_TOP ögonblicksbilder