Индексы
Вам необходимо - как минимум - индекс для каждого поля, которое используется в условии JOIN
.
Индексы полей, которые появляются в предложениях WHERE
или GROUP BY
или ORDER BY
, также в большинстве случаев полезны.
Когда в таблице используются два или более полей в JOIns (или WHERE или GROUP BY или ORDER BY), составной (комбинированный) индекс этих (двух или более) полей может быть лучше, чем отдельные индексы , Например, в таблице SiteNumbers
возможны следующие индексы: (number_accountid, number_active)
или (number_active, number_accountid)
.
Условие в полях, которые являются булевыми (ON / OFF, активный / неактивный), иногда замедляют запросы (так как индексы не являются выборочными и, следовательно, не очень полезными). В этом случае вариант реструктуризации (нормализации отца) является вариантом, но, вероятно, вы можете избежать дополнительной сложности.
Помимо обычного совета (изучите план EXPLAIN, добавьте индексы, где это необходимо, проверьте варианты запроса),
Я заметил, что в вашем запросе есть частичное декартово произведение. Таблица Accounts
имеет отношение один ко многим с тремя таблицами FTPDetails
, SiteNumbers
и PPC
. Это приводит к тому, что если у вас есть, например, 1000 учетных записей, и каждая учетная запись связана, скажем, с 10 FTPDetails, 20 SiteNumbers и 3 PPC, запрос будет возвращать для каждой учетной записи 600 строк (продукт 10x20x3). Всего 600 тыс. Строк, в которых дублируется много данных.
Вместо этого можно разделить запрос на три плюс один для базовых данных (учетная запись и остальные таблицы). Таким образом, будет передано только 34K строк данных (имеющих меньшую длину):
Accounts JOIN Clients JOIN Users
(with all fields needed from these tables)
1K rows
Accounts JOIN FTPDetails
(with Accounts.account_id and all fields from FTPDetails)
10K rows
Accounts JOIN SiteNumbers
(with Accounts.account_id and all fields from SiteNumbers)
20K rows
Accounts JOIN PPC
(with Accounts.account_id and all fields from PPC)
3K rows
и затем использовать данные из 4 запросов на стороне клиента для отображения объединенной информации.
Я бы добавил следующие индексы:
Table Accounts
index on (account_designer)
index on (account_client)
index on (account_active, account_id)
index on (account_update)
Table FTPDetails
index on (ftp_active, ftp_accountid)
Table SiteNumbers
index on (number_active, number_accountid)
Table PPC
index on (ppc_active, ppc_accountid)