Индекси
-
Нуждаете се от - поне - индекс на всяко поле, което се използва в
JOIN
състояние. -
Индекси на полетата, които се появяват в
WHERE
илиGROUP BY
илиORDER BY
клаузите също през повечето време са полезни. -
Когато в таблица се използват две или повече полета в JOIns (или WHERE или GROUP BY или ORDER BY), комбиниран (комбиниран) индекс на тези (две или повече) полета може да бъде по-добър от отделните индекси. Например в
SiteNumbers
таблица, възможните индекси са съставният(number_accountid, number_active)
или(number_active, number_accountid)
. -
Състоянието в полета, които са булеви (ВКЛ./ИЗКЛ., активно/неактивно) понякога забавят заявките (тъй като индексите не са селективни и следователно не са много полезни). Преструктурирането (нормализиране на бащата) на таблиците е опция в този случай, но вероятно можете да избегнете допълнителната сложност.
Освен обичайните съвети (разгледайте плана EXPLAIN, добавете индекси, където е необходимо, тествайте варианти на заявката),
Забелязвам, че във вашата заявка има частичен декартов продукт. Таблицата Accounts
има връзки едно към много към три таблици FTPDetails
, SiteNumbers
и PPC
. Това има ефект, че ако имате например 1000 акаунта и всеки акаунт е свързан, да речем, с 10 FTPDetails, 20 SiteNumbers и 3 PPC, заявката ще върне за всеки акаунт 600 реда (продуктът от 10x20x3). Общо 600 000 реда, където много данни се дублират.
Вместо това можете да разделите заявката на три плюс едно за основни данни (Акаунт и останалите таблици). По този начин ще бъдат прехвърлени само 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)