Mysql
 sql >> база данни >  >> RDS >> Mysql

Оптимизиране на MySQL заявки в йерархични данни

Без да отделите време за тестване, предоставихте непълен пример? определено трябва да опитате да пренаредите на съединени маси. Изходът Explain предоставя известна информация, да кажем, че подреждането по key_len трябва да бъде евристично най-бързо. Първата таблица, по която трябва да се филтрира, трябва да бъде посочена като последна, в случай че оптимизаторът не е в състояние да разбере това, вярвам.

Така че, да кажем, че редът „c, v, k, u“ е най-добрият.

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
;

„редове“ предполага ред „c/u, k, v“, но това зависи от данните:

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
;

Надявам се това да помогне.

АКТУАЛИЗИРАНЕ (избягване на присъединяването 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. Spring Boot не може да се свърже с изходите на MySQLand в Docker/Docker compose

  2. Как да разбера дали индексът на mysql се вписва изцяло в паметта

  3. Вмъкване на списък в моята база данни с помощта на Python

  4. ГРЕШКА при дублиране на MySql UUID

  5. MySQL Auto Increment?