All I know is CROSS JOIN, but sometimes I look on StackOverflow for query support and find some answer mentioning that this is not the best join. I don’t know if they’re saying that due to an opinion on what would be easier on the developer, or if CROSS JOIN is functionally inferior to its JOIN brethren. Please tell me if refactoring with another JOIN model (LEFT? INNER? x?) should result in better performance for the query example below. (Constructive criticism towards other optimizations I may not even be aware to ask about would also not go amiss)
SELECT DISTINCT relationshipNameValue.value, proper_relationship_defined.relationship,
commonRelationshipParentNameValue.value, common_relationship_defined.parent,
commonRelationshipChildNameValue.value, common_relationship_defined.child,
parentNameValue.value, proper_relationship_defined.parent,
text_value.value, proper_relationship_defined.child
FROM proper_relationship_defined
CROSS JOIN common_relationship_defined
CROSS JOIN proper_relationship_defined AS commonRelationshipParentName
CROSS JOIN proper_relationship_defined AS commonRelationshipChildName
CROSS JOIN proper_relationship_defined AS relationshipName
CROSS JOIN proper_relationship_defined AS parentName
CROSS JOIN proper_relationship_defined AS childName
CROSS JOIN text_value AS commonRelationshipParentNameValue
CROSS JOIN text_value AS commonRelationshipChildNameValue
CROSS JOIN text_value AS relationshipNameValue
CROSS JOIN text_value AS parentNameValue
CROSS JOIN text_value
CROSS JOIN concept AS childTypeCheck
WHERE proper_relationship_defined.parent = 65
AND commonRelationshipParentName.relationship = 30
AND commonRelationshipParentName.parent = common_relationship_defined.parent
AND commonRelationshipParentName.child = commonRelationshipParentNameValue.id
AND commonRelationshipChildName.relationship = 30
AND commonRelationshipChildName.parent = common_relationship_defined.child
AND commonRelationshipChildName.child = commonRelationshipChildNameValue.id
AND relationshipName.relationship = 30
AND relationshipName.parent = proper_relationship_defined.relationship
AND relationshipName.child = relationshipNameValue.id
AND parentName.relationship = 30
AND parentName.parent = proper_relationship_defined.parent
AND parentName.child = parentNameValue.id
AND text_value.id = proper_relationship_defined.child
AND childTypeCheck.id = proper_relationship_defined.child
AND childTypeCheck.type = 2
Advertisement
Answer
CROSS JOIN
generates a lot of rows, if there is no filtering. For that reason, it tends to be discouraged. Sometimes it is necessary.
In your case, you have bona fide joins. And you should learn how to use them.
For instance, for this condition:
. . .
commonRelationshipParentName CROSS JOIN
common_relationship_defined
. . .
WHERE commonRelationshipParentName.parent = common_relationship_defined.parent
is better written as:
commonRelationshipParentName JOIN
common_relationship_defined
ON commonRelationshipParentName.parent = common_relationship_defined.parent
Why is this better? It puts the connection between the tables right next to where the tables are defined in the JOIN
clause. Most databases enforce the presence of ON
, which helps ensure that you don’t accidentally forget a condition.
That said, the MySQL optimizer is smart enough to turn your syntax into JOIN
. However, I strongly recommend that you learn the proper, standard, readable JOIN
syntax. Then you can learn about outer joins, which makes this syntax more powerful.