MySQL скорость поиска между объединением и объединением и / или другим - PullRequest
0 голосов
/ 24 января 2011

Я пытаюсь создать функцию поиска, в которой пользователи вводят слово или ключевую фразу, а затем отображается информация.

Я думал об использовании ЛЕВОГО СОЕДИНЕНИЯ, чтобы добавить всю таблицу, в которой мне нужно искать, кто-то сказал мне о UNION, и я догадываюсь, что это может быть медленнее, чем JOIN

так

$query = '
SELECT * 
FROM t1
  LEFT JOIN t2 
    ON t2.content = "blabla"
  LEFT JOIN t3
    ON t3.content = "blabla"
  [...]
WHERE t1.content =  "blabla"
';

Это хорошая практика или есть лучший подход, который я должен рассмотреть?

Отправьте меня на правильный путь для этого :) и расскажите, почему это неправильно, расскажите, почему вы считаете, что ваш подход лучше, чтобы он помог мне и другим понять это:

1 Ответ

3 голосов
/ 24 января 2011

В общем, плохая идея «догадываться» о том, на что будет похожа производительность механизма SQL.Там происходит очень сложная оптимизация, которая учитывает размер таблиц, доступность индексов, количество индексов и т. Д.

В этом примере LEFT JOIN неверен, потому что выпроизводя полукартовое JOIN.По сути, в вашем наборе результатов будет много строк больше, чем вы думаете.Это потому, что каждая подходящая строка в t1 будет соединена с каждой подходящей строкой в ​​t2.Если в t1 совпадают десять строк, а в t2 три, то вы получите не десять, а тридцать результатов.

Даже если гарантировано, что из каждой таблицы будет совпадать только одна строка (исключая проблему декартового объединения), ясно, что LEFTРешение JOIN даст вам набор данных, с которым очень сложно работать.Это связано с тем, что столбцы содержимого каждой таблицы, к которой вы присоединяетесь, будут отдельными столбцами в наборе результатов.Вам придется изучить каждый из столбцов, чтобы определить, какая таблица соответствует.

В этом случае UNION является лучшим решением.

Также обратите внимание:

  1. Использование «*» в SELECT, как правило, не очень хорошая идея.Это снижает производительность (поскольку все столбцы должны быть собраны в результирующем наборе), и в таком случае вы теряете возможность ALIAS каждого из столбцов содержимого, что затрудняет работу с результирующим набором.*

    Это очень новое использование LEFT JOIN.Обычно он используется для связывания строк из двух разных таблиц.В этом случае вы используете его для создания трех отдельных наборов результатов "бок о бок".Большинству программистов SQL придется какое-то время взглянуть на это утверждение, чтобы выяснить, каково было ваше намерение.

...