SQL Оптимизирует левый внешний запрос соединения - PullRequest
0 голосов
/ 11 сентября 2018

прежде всего спасибо заранее, что нашли время, чтобы прочитать и опубликовать любые ответы, я ценю это!

У меня есть две таблицы, одна для свойств, где она хранит информацию о каждой собственности / имуществе.Другая таблица предназначена для переводов, где хранятся такие данные, как заголовок и описание, на каждом языке, который пользователь решает написать.

В таблице свойств в столбце t_reference будет храниться «ссылка» перевода в переводах.Таблица.Это числовое значение, которое будет равно 0, если для этого конкретного элемента нет перевода.

В таблице переводов предыдущая ссылка t хранится как «ссылка».Вывод таблицы:

id  int(11)
reference   mediumint(9)
lang    varchar(5)
is_default  tinyint(4)
t_title     varchar(255)
t_description   text 

Теперь, чтобы получить информацию, я использую этот запрос:

SELECT
    p.id,
    p.t_reference,
    p.category,
    IFNULL(tr.t_title, def.t_title) 'title',
    IFNULL(tr.t_description, def.t_description) 'description'
FROM properties p
LEFT OUTER JOIN translations tr
    ON (p.t_reference > 0 AND p.t_reference = tr.reference AND tr.lang = 'de_DE')
LEFT OUTER JOIN translations def
    ON (p.t_reference > 0 AND p.t_reference = def.reference AND def.is_default = 1)
WHERE p.visibility='1'

p - таблица свойств, tr - данные таблицы переводов, ЕСЛИ перевод существует, def - язык по умолчанию для данных таблицы перевода.Проблема, с которой я сталкиваюсь, заключается в том, что при наличии 300 свойств этот запрос увеличивает скорость визуализации страницы примерно на 80 мс.

Я пытаюсь реализовать многоязычный ввод для клиента.Раньше заголовок и описание каждого свойства просто сохранялись в столбце, но теперь, поскольку клиент должен иметь возможность вводить определенный текст для разных языков, вместо использования жестко закодированных столбцов, таких как, например, «title_en», «title_de»Я думал, что это будет лучший способ сделать это.Единственная проблема заключается в скорости запроса.

Прежде всего, есть ли способ улучшить этот запрос, чтобы ускорить процесс?

Во-вторых, будет ли это считаться плохой практикой,вместо использования JOIN в самом запросе.Сначала соберите все данные свойств, а затем выполните отдельный запрос к таблице переводов, выполнив поиск по ссылке.

1 Ответ

0 голосов
/ 11 сентября 2018

Начните с написания запроса следующим образом:

SELECT p.id, p.t_reference, p.category,
           COALESCE(tr.t_title, def.t_title) as title,
           COALESCE(tr.t_description, def.t_description)  as description
FROM properties p LEFT OUTER JOIN
     translations tr 
     ON p.t_reference = tr.reference AND
        tr.lang = 'de_DE' LEFT OUTER JOIN
        translations def
     ON p.t_reference = def.reference AND
        def.is_default = 1
WHERE p.visibility = 1 AND  -- guessing visibility is a number
      p.t_reference > 0     -- guessing this is a filtering condition

Обратите внимание на изменения:

  • Нет кавычек вокруг '1', потому что visibility предположительно является числом.
  • Перемещение условия p.t_reference > 0 в предложение WHERE.Поскольку это в первой таблице, это предположительно условие фильтрации.
  • Я предпочитаю COALESCE() IFNULL(), потому что первая - стандартная функция ISO / ANSI в SQL.

Требуются индексы для:

  • properties(visibility, t_reference)
  • translations(reference, lang, is_default).
...