Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用重数据库从MySQL中的4个表中获取行_Mysql_Sql - Fatal编程技术网

使用重数据库从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行
现在我的问题是,当我试图通过加入所有表来获取10行时,mysql的负载太大,有时我的应用程序完全停止工作

我正在申请加入左派。请建议我从以上四张桌子中只取10行的最佳方式

我有以下疑问:-

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行的临时表,所以实际上它正在运行。所以请建议我,你能告诉我两个版本的查询的执行时间和解释吗?所以我可以看一看然后告诉你一些事情。