sql >> Database teknologi >  >> RDS >> Mysql

Optimering af MySQL-forespørgsler på tværs af hierarkiske data

Uden at bruge tid på at teste det, har du givet et ufuldstændigt eksempel? du bør bestemt prøve at genbestille af sammenføjede borde. Forklar output giver nogle oplysninger, lad os sige, at bestilling efter key_len skulle være heuristisk hurtigst. Den første tabel, der skal filtreres efter, bør angives som den sidste, hvis optimeringsværktøjet ikke er i stand til at finde ud af det, tror jeg.

Så lad os sige 'c, v, k, u' rækkefølgen er den bedste.

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' ville foreslå 'c/u, k, v' rækkefølge, men det afhænger af 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
;

Håber dette hjælper.

OPDATERING (undgå 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. SQL Server Login fejl:Login mislykkedes for brugeren 'NT AUTHORITY\SYSTEM'

  2. Automatisk indeksstyring i Azure SQL-database

  3. Ruby on Rails installationsproblem (Windows)

  4. Få WP-indlæg baseret på flere meta-nøgle/værdi-par ved hjælp af IN