【发布时间】: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