【问题标题】:multi left join sql - optimize table schema or sql多左连接 sql - 优化表模式或 sql
【发布时间】:2017-12-12 01:02:24
【问题描述】:

这是我的sql,太慢了,请告诉我如何优化我的表架构或这个sql

SELECT 
    activityLog.id, activityLog.business_id, activityLog.business_typedict.label, 
    dict.id, callLog.id, callLog.duration, callLog.record_url, 
    leads.name AS "leads.name", customer.name AS "customer.name", 
    niche.name AS "niche.name", contacts.name AS "contacts.name", 
    task.name AS "task.name" 
FROM 
    biz_business_log activityLog 
    LEFT JOIN leads_leads leads 
        ON activityLog.business_type=1 AND activityLog.business_id=leads.id 
          AND EXISTS (SELECT 1 FROM sys_office 
                      WHERE 1 = 1 AND (id = '5' OR parent_ids LIKE '5,%') 
                          AND id=leads.office_id) 
    LEFT JOIN cust_customer customer 
        ON activityLog.business_type=2 AND activityLog.business_id=customer.id 
          AND EXISTS (SELECT 1 FROM sys_office 
                      WHERE 1 = 1 AND (id = '5' OR parent_ids LIKE '5,%') 
                          AND id=customer.office_id) 
    LEFT JOIN niche_niche niche 
        ON activityLog.business_type=3 AND activityLog.business_id=niche.id 
          AND EXISTS (SELECT 1 FROM sys_office 
                      WHERE 1 = 1 AND (id = '5' OR parent_ids LIKE '5,%') 
                          AND id=niche.office_id) 
    LEFT JOIN contacts_contacts contacts 
        ON activityLog.business_type=4 AND activityLog.business_id=contacts.id 
          AND EXISTS (SELECT 1 FROM sys_office 
                      WHERE 1 = 1 AND (id = '5' OR parent_ids LIKE '5,%') 
                          AND id=contacts.office_id) 
    LEFT JOIN task_task task 
        ON activityLog.business_type=5 AND activityLog.business_id=task.id 
          AND EXISTS (SELECT 1 FROM sys_office 
                      WHERE 1 = 1 AND (id = '5' OR parent_ids LIKE '5,%') 
                          AND id=task.office_id) 
    LEFT JOIN sys_dict dict 
        ON activityLog.activity_log_type = dict.value 
    LEFT JOIN biz_call_log callLog 
        ON callLog.business_log_id = activityLog.id 
WHERE 
    1=1 
    AND dict.type='activity_log_type' 
    AND dict.company_id = 2 
    AND activityLog.company_id = 2 
    AND dict.delete_flag = 0 
ORDER BY
    IFNULL(activityLog.update_time, activityLog.create_time) DESC 
LIMIT 
    0,20

解释:

【问题讨论】:

  • 您需要给 s 一些统计信息,例如表大小和所涉及表 + 索引的结构此外.. 为什么 1=1 在哪里?列 activityLog.company_id 是否已编入索引?
  • 您使用 PostgreSQL 和 MySQL 标记了您的问题,但执行计划是 MySQL。您实际使用的是哪个数据库?这个查询(看起来它是由一个(不太好的)ORM 生成的)可以通过使用 CTE 得到显着改进,CTE 支持 PostgreSQL,但不支持 MySQL(从 5.7 版开始)。

标签: mysql sql postgresql join


【解决方案1】:

因为 dict 不使用索引而使用临时

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2015-06-20
    相关资源
    最近更新 更多