【问题标题】:Create index for Join some table in MySQL在 MySQL 中为 Join some table 创建索引
【发布时间】:2018-10-30 16:56:07
【问题描述】:

我有下面的 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

您能帮我创建一些索引来提高此查询的性能吗? 谢谢

【问题讨论】:

  • 您需要用于过滤或排序数据的字段索引。
  • 请编辑您的问题并为表添加 DDL,包括索引和查询的执行计划。
  • 嗨@stickybit,我添加了解释那个SQL的图片。
  • SUMed 是什么???

标签: mysql sql database performance indexing


【解决方案1】:

如果以下三个复合指标有什么改善,你可以试试。

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);

如果totalvtiger_salesorder 中。那么就有可能只单独查询索引。

【讨论】:

    【解决方案2】:

    这些索引可能会有所帮助:

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

    但是……

    • 如果所有JOINs都是1:1,则只需要total所在的表即可。
    • 如果某些JOINs 是 1:many, thenCOUNT(*)and/orSUM(total)` 将得到夸大的值!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2012-04-07
      • 2012-05-09
      相关资源
      最近更新 更多