使用重数据库从MySQL中的4个表中获取行
我的数据库中有活动、联系人、用户、已删除的联系人表使用重数据库从MySQL中的4个表中获取行,mysql,sql,Mysql,Sql,我的数据库中有活动、联系人、用户、已删除的联系人表 活动表有500万行 联系人表有500万行 用户表有5000行 delete_联系人表有850000行 现在我的问题是,当我试图通过加入所有表来获取10行时,mysql的负载太大,有时我的应用程序完全停止工作 我正在申请加入左派。请建议我从以上四张桌子中只取10行的最佳方式 我有以下疑问:- SELECT activity.id, activity.ipaddress, deleted_contact.name,
- 活动表有500万行
- 联系人表有500万行
- 用户表有5000行
- delete_联系人表有850000行
SELECT activity.id,
activity.ipaddress,
deleted_contact.name,
activity.city,
activity.country,
activity.state,
activity.user_agent,
activity.browser_name,
activity.os_platform,
activity.details AS details,
activity.file_name AS filename,
activity.created_at AS Date,
activity.model_id,
activity.user_id,
activity.contact_id,
activity.type,
activity.city,
activity.state,
activity.country,
contact.name AS Contact,
email.subject AS emailsubject,
email.opened,
email.schedule_date,
email.schedule_timezone,
FROM activity
LEFT JOIN contact ON activity.contact_id = contact.id
LEFT JOIN email ON activity.model_id = email.id
LEFT JOIN user ON activity.user_id = user.id
LEFT JOIN deleted_contact ON deleted_contact.contact_id = activity.contact_id
WHERE activity.user_id IN (2,
56,
78,
93,
105,
2004,
345,
450,
321,
456)
GROUP BY activity.id,
email.id
ORDER BY activity.id DESC LIMIT 0,
10
我不知道您的数据库,也无法证明我的代码,但我的想法是在联接所有表之前,使用子选择选择这10行。这应该比其他方法更快
SELECT act.id,
act.ipaddress,
deleted_contact.name,
act.city,
act.country,
act.state,
act.user_agent,
act.browser_name,
act.os_platform,
act.details AS details,
act.file_name AS filename,
act.created_at AS Date,
act.model_id,
act.user_id,
act.contact_id,
act.type,
act.city,
act.state,
act.country,
contact.name AS Contact,
email.subject AS emailsubject,
email.opened,
email.schedule_date,
email.schedule_timezone,
FROM
(SELECT activity.id,
activity.ipaddress,
activity.city,
activity.country,
activity.state,
activity.user_agent,
activity.browser_name,
activity.os_platform,
activity.details AS details,
activity.file_name AS filename,
activity.created_at AS Date,
activity.model_id,
activity.user_id,
activity.contact_id,
activity.type,
activity.city,
activity.state,
activity.country
FROM activity WHERE activity.user_id IN (2,56,78,93,105,2004,345,450,321,456) AS act)
LEFT JOIN contact ON act.contact_id = contact.id
LEFT JOIN email ON act.model_id = email.id
LEFT JOIN user ON act.user_id = user.id
LEFT JOIN deleted_contact ON deleted_contact.contact_id = act.contact_id
GROUP BY act.id,
email.id
ORDER BY act.id DESC LIMIT 0,10
最终我找到了答案。实际上,当我在phpMyAdmin中执行解释查询时,它向我显示它正在创建临时表,因为从活动表中,它有来自这些用户的26000行,并且我正在查询结束时应用group by。所以我删除了分组,它给了我非常快的结果,只有0.26秒 请添加查询和一些关于表结构的更多信息,如索引的位置等。如果在我的活动表中的mysql(而不是在应用程序中)中运行查询,需要多长时间?我的用户id不唯一,型号id不唯一,联系人id不唯一,通知不唯一且在创建时不唯一。您的id在所有表中都是主键吗?是的,我在每个表中的id上都有主键。Jan Zeiseweisa事实上,我用“Explain”关键字直接在我的live server的phpmyadmin中尝试了您的查询,因此我发现“activity table”的“Extra”栏中有“Using temporary;Using filesort”,所以我认为它正在创建包含28700行的临时表,所以实际上它正在运行。所以请建议我,你能告诉我两个版本的查询的执行时间和解释吗?所以我可以看一看然后告诉你一些事情。