У меня SQL-запрос для базы данных MySQL ниже:
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;
Нажмите здесь, чтобы показать Объяснение выше SQL
Не могли бы вы помочь мне создать некоторый индекс для повышения производительности для этого запроса. Спасибо
Эти индексы могут помочь:
crmentity: (deleted, modifiedtime) -- in this order
salesorder: (salesorderid)
Но...
JOINs
равны 1:1, вам нужна только таблица с total
в ней.JOINs
равны 1: многие , then
COUNT (*) and/or
SUM (total) 'получат завышенные значения!Вы можете попробовать, если следующие три составных индекса принесут какое-либо улучшение.
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
. Тогда есть вероятность, что только один запрос запрашивается только один.