Создать индекс для соединения некоторых таблиц в MySQL

0

У меня 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

Не могли бы вы помочь мне создать некоторый индекс для повышения производительности для этого запроса. Спасибо

  • 0
    Вам нужны индексы на поле, которые используются для фильтрации или упорядочения ваших данных.
  • 0
    Пожалуйста, измените ваш вопрос и добавьте DDL для таблиц, включая индексы и план выполнения вашего запроса.
Показать ещё 2 комментария
Теги:
database
performance
indexing

2 ответа

0

Эти индексы могут помочь:

crmentity:   (deleted, modifiedtime)  -- in this order
salesorder:  (salesorderid)

Но...

  • Если все JOINs равны 1:1, вам нужна только таблица с total в ней.
  • Если некоторые из JOINs равны 1: многие , then COUNT (*) and/or SUM (total) 'получат завышенные значения!
0

Вы можете попробовать, если следующие три составных индекса принесут какое-либо улучшение.

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. Тогда есть вероятность, что только один запрос запрашивается только один.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню