索引
>您至少需要 – 在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的乘积).总共600K行,其中许多数据是重复的.
您可以将查询拆分为三加一基础数据(帐户和其余表).这样,只会传输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)