Существуют ли более быстрые альтернативы модели CROSS JOIN, используемой ниже? - PullRequest
0 голосов
/ 24 апреля 2020

Все, что я знаю, это CROSS JOIN, но иногда я обращаюсь к StackOverflow за поддержкой запросов и нахожу некоторые ответы, в которых говорится, что это не лучшее соединение. Я не знаю, говорят ли они это из-за мнения о том, что будет проще для разработчика, или если CROSS JOIN функционально уступает своим собратьям JOIN. Пожалуйста, скажите мне, если рефакторинг с другой моделью JOIN (LEFT? INNER? X?) Приведет к повышению производительности для примера запроса ниже. (Конструктивная критика в отношении других оптимизаций, о которых я, возможно, даже не подозреваю спросить, также не будет go неправильной)

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

1 Ответ

3 голосов
/ 24 апреля 2020

CROSS JOIN генерирует много строк, если фильтрация отсутствует. По этой причине, это, как правило, не рекомендуется. Иногда это необходимо.

В вашем случае у вас есть добросовестных соединений. И вы должны научиться их использовать.

Например, для этого условия:

. . .
      commonRelationshipParentName CROSS JOIN
      common_relationship_defined
. . .
WHERE commonRelationshipParentName.parent = common_relationship_defined.parent 

лучше записать как:

commonRelationshipParentName JOIN
common_relationship_defined
ON commonRelationshipParentName.parent = common_relationship_defined.parent

Почему это лучше? Он устанавливает связь между таблицами прямо рядом с тем местом, где таблицы определены в предложении JOIN. В большинстве баз данных присутствует ON, что помогает избежать случайного забывания условия.

При этом оптимизатор MySQL достаточно умен, чтобы превратить ваш синтаксис в JOIN. Однако я настоятельно рекомендую вам изучить правильный, стандартный , читаемый JOIN синтаксис. Затем вы можете узнать о внешних объединениях, что делает этот синтаксис более мощным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...