इसका परीक्षण किए बिना, आपने एक अधूरा उदाहरण प्रदान किया? आपको निश्चित रूप से पुन:क्रमित करने का प्रयास करना चाहिए शामिल तालिकाओं के। समझाएं आउटपुट कुछ जानकारी प्रदान करता है, मान लें कि 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
;
आशा है कि यह मदद करता है।
अपडेट करें (वर्चर जॉइन से बचना):
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
;