Indices
You need - at least - an index for each field that is used in the JOIN .
Field indexes that appear in WHERE or GROUP BY or ORDER BY clauses are also useful in most cases.
If two or more fields in a table are used in JOIns (either WHERE or GROUP BY or ORDER BY), the combined (combined) index of these (two or more) fields may be better than separate indexes, for example, in the SiteNumbers table SiteNumbers possible indices are a join (number_accountid, number_active) or (number_active, number_accountid) .
A condition in fields that are logical (ON / OFF, active / inactive) sometimes slows down queries (since indexes are not selective and therefore not very useful). In this case, restructuring (normalizing the father) tables is an option, but you can probably avoid the extra complexity.
In addition to the usual tips (study the EXPLAIN plan, add indexes, where necessary, test query options),
I noticed that your request has a partial Cartesian product. The Accounts table has a one-to-many relationship with the three FTPDetails , SiteNumbers and PPC tables. This leads to the fact that if you have 1000 accounts and each account is associated with, say, 10 FTPDetails, 20 SiteNumbers and 3 PPC, the request will return 600 rows for each account (product 10x20x3). Only 600K rows where many data is duplicated.
Instead, you can split the query into three plus one for the underlying data (account and other tables). Thus, only 34K data lines (having shorter lengths) will be transmitted:
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
and then use the data from 4 client-side queries to show combined information.
I would add the following indexes:
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)
source share