我对 MySQL 数据库有如下 SQL 查询:
SELECT
count(*) AS count,
sum(total) AS total
FROM
vtiger_salesorder
INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_salesorder.salesorderid
INNER JOIN vtiger_sobillads ON vtiger_salesorder.salesorderid = vtiger_sobillads.sobilladdressid
INNER JOIN vtiger_soshipads ON vtiger_salesorder.salesorderid = vtiger_soshipads.soshipaddressid
INNER JOIN vtiger_salesordercf ON vtiger_salesordercf.salesorderid = vtiger_salesorder.salesorderid
INNER JOIN vtiger_account ON vtiger_account.accountid = vtiger_salesorder.accountid
LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_salesordercf.cf_456
LEFT JOIN vtiger_contactdetails ON vtiger_salesorder.contactid = vtiger_contactdetails.contactid
LEFT JOIN vtiger_soshop ON vtiger_soshop.salesorderid = vtiger_salesorder.salesorderid
WHERE
vtiger_crmentity.deleted = 0
ORDER BY
vtiger_crmentity.modifiedtime DESC;
Please click here to show Explain above SQL
您能帮我创建一些索引来提高此查询的性能吗? 谢谢
最佳答案
您可以尝试以下三个复合索引是否有改善。
CREATE INDEX idxCrmidDeleted
ON vtiger_crmentity
(crmid,
deleted);
CREATE INDEX idxSalesorderidAccountidContactid
ON vtiger_salesorder
(salesorderid,
accountid,
contactid);
CREATE INDEX idxSalesorderidCf_456
ON vtiger_salesordercf
(salesorderid,
cf_456);
检查执行计划是否被执行。
total
列从何而来?如果它来自上面索引的任何表,也可以尝试像上面这样的索引,但另外将 total
作为最后一列。例如
CREATE INDEX idxSalesorderidAccountidContactid
ON vtiger_salesorder
(salesorderid,
accountid,
contactid,
total);
如果total
位于vtiger_salesorder
中。那么有可能只单独查询索引。
关于mysql - 在 MySQL 中为连接某个表创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50441992/