оптимизированный запрос соединения для нескольких таблиц mysql / php - PullRequest
0 голосов
/ 07 октября 2019

Я хочу объединить ниже запросы, чтобы сократить время выполнения, есть всего 10 таблиц, из которых я хочу получить данные, и 11-я таблица, по которой я могу выполнить JOIN. У меня есть столбец datetime в каждой таблице, и я хочу получить данные на основе этого столбца datetime, данные только из той таблицы, в которой сопоставлено заданное условие даты.

$qry1 = "SELECT m.fullName, l.loanAmount AS loanAmount, l.loanStartDate FROM tblMember m
    LEFT JOIN tblLoan l ON m.memberNumber = l.memberNumber
    WHERE l.loanStartDate = '$date' AND l.is_active!=2";

  $qry1_1 = "SELECT m.fullName, li.installment_amount, li.interest_amount , li.installment_added_date, li.installment_comment FROM tblMember m
    LEFT JOIN tblLoan l ON m.memberNumber = l.memberNumber
    LEFT JOIN tblLoanInstallments li ON l.id = li.loan_id
    WHERE li.installment_added_date = '$date' AND li.status=1";

  $qry2 = "SELECT m.fullName, f.fdAmount, f.fdStartDate FROM tblMember m
    LEFT JOIN tblFD f ON m.memberNumber = f.memberNumber
    WHERE  f.fdStartDate = '$date' AND f.is_active = 1";

  $qry2_2 = "SELECT m.fullName, fi.installment_amount, fi.interest_amount, fi.installment_added_date, fi.installment_comment FROM tblMember m
    LEFT JOIN tblFD f ON m.memberNumber = f.memberNumber
    LEFT JOIN tblFDInstallments fi ON f.id = fi.fd_id
    WHERE fi.installment_added_date = '$date' AND fi.status != 2";

  $qry3 = "SELECT m.fullName, shi.saving_amount, shi.installment_amount, shi.interest_amount, shi.installment_added_date, shi.installment_comment FROM tblMember m
    LEFT JOIN tblShare sh ON m.memberNumber = sh.memberNumber
    LEFT JOIN tblShareInstallments shi ON sh.id = shi.s_id
    WHERE shi.installment_added_date = '$date' AND shi.status != 2";

  $qry4 = "SELECT m.fullName, si.saving_amount, si.installment_amount, si.interest_amount, si.installment_added_date, si.installment_comment FROM tblMember m
    LEFT JOIN tblOnlySaving s ON m.memberNumber = s.memberNumber
    LEFT JOIN tblSavingInstallments si ON s.id = si.s_id
    WHERE si.installment_added_date = '$date' AND si.status != 2";

  $qry5 = "SELECT m.fullName, csi.installment_amount, csi.interest_amount, csi.installment_added_date, csi.installment_comment FROM tblMember m
    LEFT JOIN tblCompulsorySaving cs ON m.memberNumber = cs.memberNumber
    LEFT JOIN tblCSSavingInstallments csi ON cs.id = csi.s_id
    WHERE csi.installment_added_date = '$date' AND csi.status != 2";

Как оптимизироватьэти запросы? Я пытался присоединиться ко всей таблице, но он выполняется до 6-7 минут, чем выдает ошибку

SELECT 
    m.fullName,
    l.loanAmount AS loanAmount,
    l.loanStartDate,
    li.installment_amount,
    li.interest_amount,
    li.installment_added_date,
    f.fdAmount,
    f.fdStartDate,
    fi.installment_amount,
    fi.interest_amount,
    fi.installment_added_date,
    shi.saving_amount,
    shi.installment_amount,
    shi.interest_amount,
    shi.installment_added_date,
    shi.installment_comment,
    si.saving_amount,
    si.installment_amount,
    si.interest_amount,
    si.installment_added_date,
    si.installment_comment,
    csi.installment_amount,
    csi.interest_amount,
    csi.installment_added_date,
    csi.installment_comment
FROM
    tblMember m
        LEFT JOIN
    tblLoan l ON m.memberNumber = l.memberNumber
        LEFT JOIN
    tblLoanInstallments li ON l.id = li.loan_id
        LEFT JOIN
    tblFD f ON m.memberNumber = f.memberNumber
        LEFT JOIN
    tblFDInstallments fi ON f.id = fi.fd_id
        LEFT JOIN
    tblShare sh ON m.memberNumber = sh.memberNumber
        LEFT JOIN
    tblShareInstallments shi ON sh.id = shi.s_id
        LEFT JOIN
    tblOnlySaving s ON m.memberNumber = s.memberNumber
        LEFT JOIN
    tblSavingInstallments si ON s.id = si.s_id
        LEFT JOIN
    tblCompulsorySaving cs ON m.memberNumber = cs.memberNumber
        LEFT JOIN
    tblCSSavingInstallments csi ON cs.id = csi.s_id
WHERE
        (MONTH(l.loanStartDate) = '5'
        AND YEAR(l.loanStartDate) = '2018'
        AND l.is_active != 2)
        OR (MONTH(li.installment_added_date) = '5'
        AND YEAR(li.installment_added_date) = '2018'
        AND li.status = 1)
        OR (MONTH(f.fdStartDate) = '5'
        AND YEAR(f.fdStartDate) = '2018'
        AND f.is_active != 2)
        OR (MONTH(fi.installment_added_date) = '5'
        AND YEAR(fi.installment_added_date) = '2018'
        AND fi.status = 1)
        OR (MONTH(shi.installment_added_date) = '5'
        AND YEAR(shi.installment_added_date) = '2018'
        AND shi.status = 1)
        OR (MONTH(si.installment_added_date) = '5'
        AND YEAR(si.installment_added_date) = '2018'
        AND si.status = 1)
        OR (MONTH(csi.installment_added_date) = '5'
        AND YEAR(csi.installment_added_date) = '2018'
        AND csi.status = 1)

WHERE условие отличается в обоих запросах, потому что ранее я давал дату от начала и теперь я хочуизмените это на месяц. Все таблицы имеют около 10000 записей, а запрос может содержать 1000-2000 строк RESULT

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