【问题标题】:very Slow Mysql INNER JOIN非常慢的Mysql INNER JOIN
【发布时间】:2015-07-12 17:08:05
【问题描述】:

这个查询在我的本地开发机器上运行良好,但在远程服务器上需要很长时间,并且似乎超时服务器并出现错误 500,有没有更好的方法来编写这个 select 语句?,任何建议都会受到极大的欢迎.

感谢

J

<?php

$members = new WA_MySQLi_RS("members",$alpha,1);

$members->setQuery("SELECT
registration.*,
child_base_survey.*,
child_base_scas.*,
child_base_smqf.*,
parent_base_survey.*,
parent_base_ippa.*,
parent_base_eac.*,
parent_base_scas.*,
parent_base_smqf.*,
parent_base_eval.*,
user_access_level.*,
parent_one_month_survey.*,
parent_one_month_ippa.*,
parent_one_month_eac.*,
parent_one_month_eval.*,
child_three_month_survey.*,
child_three_month_scas.*,
child_three_month_smqf.*,
parent_three_month_survey.*,
parent_three_month_scas.*,
parent_three_month_smqf.*,
parent_three_month_eval.*,
cron.*
FROM registration
INNER JOIN child_base_survey ON registration.rego_parent_uid = child_base_survey.child_base_survey_uid
INNER JOIN child_base_scas ON child_base_survey.child_base_survey_uid = child_base_scas.child_base_scas_uid
INNER JOIN child_base_smqf ON child_base_scas.child_base_scas_uid = child_base_smqf.child_base_smqf_uid
INNER JOIN parent_base_survey ON child_base_smqf.child_base_smqf_uid = parent_base_survey.parent_base_survey_uid
INNER JOIN parent_base_ippa ON parent_base_survey.parent_base_survey_uid = parent_base_ippa.parent_base_ippa_uid
INNER JOIN parent_base_eac ON parent_base_ippa.parent_base_ippa_uid = parent_base_eac.parent_base_eac_uid
INNER JOIN parent_base_scas ON parent_base_eac.parent_base_eac_uid = parent_base_scas.parent_base_scas_uid
INNER JOIN parent_base_smqf ON parent_base_scas.parent_base_scas_uid = parent_base_smqf.parent_base_smqf_uid
INNER JOIN parent_base_eval ON parent_base_smqf.parent_base_smqf_uid = parent_base_eval.parent_base_eval_uid
INNER JOIN user_access_level ON parent_base_eval.parent_base_eval_uid = user_access_level.user_access_level_uid
INNER JOIN parent_one_month_survey ON user_access_level.user_access_level_uid = parent_one_month_survey.parent_one_month_survey_uid
INNER JOIN parent_one_month_ippa ON parent_one_month_survey.parent_one_month_survey_uid = parent_one_month_ippa.parent_one_month_ippa_uid
INNER JOIN parent_one_month_eac ON parent_one_month_ippa.parent_one_month_ippa_uid = parent_one_month_eac.parent_one_month_eac_uid
INNER JOIN parent_one_month_eval ON parent_one_month_eac.parent_one_month_eac_uid = parent_one_month_eval.parent_one_month_eval_uid
INNER JOIN child_three_month_survey ON parent_one_month_eval.parent_one_month_eval_uid = child_three_month_survey.child_three_month_survey_uid
INNER JOIN child_three_month_scas ON child_three_month_survey.child_three_month_survey_uid = child_three_month_scas.child_three_month_scas_uid
INNER JOIN child_three_month_smqf ON child_three_month_scas.child_three_month_scas_uid = child_three_month_smqf.child_three_month_smqf_uid
INNER JOIN parent_three_month_survey ON child_three_month_smqf.child_three_month_smqf_uid = parent_three_month_survey.parent_three_month_survey_uid
INNER JOIN parent_three_month_scas ON parent_three_month_survey.parent_three_month_survey_uid = child_three_month_smqf.child_three_month_smqf_uid
INNER JOIN parent_three_month_smqf ON parent_three_month_scas.parent_three_month_scas_uid = parent_three_month_smqf.parent_three_month_smqf_uid
INNER JOIN parent_three_month_eval ON parent_three_month_smqf.parent_three_month_smqf_uid = parent_three_month_eval.parent_three_month_eval_uid
INNER JOIN cron ON parent_three_month_eval.parent_three_month_eval_uid = cron.cron_uid");

?>

【问题讨论】:

  • 所有表格列都需要吗?如果没有,只选择有用的。
  • 是的,所有表格都是必需的(我认为),因为当用户注册发生时,每个表格的 .uid 都已设置,因此我可以在所有表​​格中进行查询并在完成调查时更新内容,我如果代码不好,我是 MYSQL 的新手,抱歉 :-( 有没有办法只在注册时添加registration.uid,仍然得到mysql结果?。
  • 我的意思是列,您选择了所有列(registration.*、child_base_survey.* 等)。
  • 啊,不是在注册时没有...我所需要的只是 child_base_survey.child_base_survey_uid child_base_scas.child_base_scas_uid 等等......这会有很大的不同吗?
  • @user994770 您需要查看您的服务器错误日志以了解它失败的原因。其他都是猜测

标签: php mysql inner-join


【解决方案1】:

在我看来,您缺少 where 子句。事实上,它正在获取所有数据。从上面的 cmets 看来,您的内存不足。你不应该为一个用户过滤它吗?或者尝试限制为 1 进行测试 - 只是为了证明查询本身是可以的。

【讨论】:

  • 这里设置了 LIMIT $members = new WA_MySQLi_RS("members",$alpha,1); WA_MySQLi_RS($name, $con, $Max_Rows);
  • 请告诉我们您在每个表中有多少行。请。
  • 每张桌子大约 100 个字符
【解决方案2】:

托管公司似乎一直存在服务器问题。因此错误 500 和超时,

感谢大家的帮助和见解。

J

【讨论】:

    【解决方案3】:

    当然,这是一个非常糟糕的查询,但 500 错误不是 TimeOut 错误。 500 - 内部服务器错误,意味着您的脚本在内存限制或分段错误后挂起。

    查看服务器 php 错误日志以获取更多信息。

    【讨论】:

    • 这是一个很大的查询。但是,撇开结构性问题不谈,这还不错。
    • 这甚至不是一个特别复杂的查询——只要所有这些连接字段都被索引就可以了。
    • 每个 foo.foo_uid 都被索引并设置为主键和自动增量。远程服务器仍然超时.. 很奇怪,就像我说的在本地工作正常..?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2014-01-21
    • 2017-01-24
    • 2013-11-11
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多