Mysql запрос, объединяющий 5 таблиц - PullRequest
2 голосов
/ 23 января 2020

Я пытаюсь объединить 5 таблиц, в которых я хочу получить другую валюту, упомянутую в разных таблицах, с одинаковым идентификатором контракта.
Это дает мне результаты, когда я соединяю любые три таблицы, но когда я добавляю еще одну таблицу в запросе сервер перестает отвечать на запросы , пока мне не придется завершить процесс.

Пожалуйста, помогите мне, где я делаю ошибку.

SELECT c.department_id,
  c.contract_id,
  c.seller_id,
  c.buyer_id,
  c.contract_ratecurrency AS contractcurrency,
  b.currency_id           AS billcurrency,
  s.saleinv_currency      AS saleinvcurrency,
  cm.currency_id          AS commissioncurrency,
  sl.currency_id          AS cmlogcurrency,
  c.contract_iscancel
FROM tbl_contracts C
JOIN tbl_contract_bill b ON c.contract_id=b.contract_id
JOIN tbl_contract_saleinvoice s ON c.contract_id =s.contract_id
JOIN tbl_commission_payment cm ON c.department_id = cm.department_id
JOIN tbl_saleinvoice_commission_log sl ON c.department_id = sl.department_id
WHERE (c.contract_ratecurrency <> s.saleinv_currency
       OR c.contract_ratecurrency     <> b.currency_id
       OR s.saleinv_currency          <> b.currency_id
       OR cm.currency_id              <> sl.currency_id
       OR c.contract_ratecurrency     <> cm.currency_id
       OR s.saleinv_currency          <> cm.currency_id
       OR b.currency_id               <> cm.currency_id)
AND (c.contract_iscancel        =0)

requried result should be

ccontractid,csellerid,cbuyerid,ccurrency,bcurrency,scurrency,cmcurrency,slcurrency
101,25,50,1,1,2,3,1
102,28,16,2,3,1,3,2



1 Ответ

0 голосов
/ 23 января 2020

Похоже, у вас проблемы с производительностью. Для оптимизации структуры вашей базы данных у вас есть несколько вариантов:

  1. Добавление индексов на ваши ключи.

    Давайте посмотрим на ваш оператор соединения:

    JOIN tbl_saleinvoice_commission_log sl ON c .department_id = sl.department_id

    Добавление кластерного индекса для кода отдела_для таблицы tbl_saleinvoice_commission_log будет очень поможет вам в производительности. Для получения дополнительной информации вы можете проверить эту ссылку.

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

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

...