Nếu không dành thời gian kiểm tra nó, bạn đã cung cấp một ví dụ chưa đầy đủ? Bạn chắc chắn nên thử sắp xếp lại thứ tự trong số các bảng đã tham gia. Giải thích đầu ra cung cấp một số thông tin, giả sử đặt hàng bằng key_len sẽ nhanh nhất về mặt kinh nghiệm. Bảng đầu tiên được lọc nên được liệt kê là bảng cuối cùng trong trường hợp trình tối ưu hóa không thể tìm ra điều đó, tôi tin.
Vì vậy, giả sử thứ tự 'c, v, k, u' là tốt nhất.
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
;
'row' sẽ đề xuất thứ tự 'c / u, k, v', nhưng điều đó phụ thuộc vào dữ liệu:
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
;
Hy vọng điều này sẽ hữu ích.
CẬP NHẬT (tránh tham gia 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
;