我在这里找到了一些答案,我发现它在本地工作,所以我推到了我的测试盒,我发现这个特定的数据库查询持续超过1300秒,进入mysql和{{ 1}}它挂在SHOW PROCESSLIST;
这是Laravel 4.2,非常古老的遗留代码,我只是想在更高版本上工作时稳定。根据api_call,下面的代码大约每30秒重复一次,除了它没有完成并接收copying to tmp table
之外,这一切都很好,我觉得我正在做一些递归的东西,或者会搜索一个非常大的数据库是一个问题这里吗?
我要做的就是运行一个groupBy,而不是按照我想要分组的第一个分组,以防其他细节被更新。
我们非常感谢您提供的任何帮助。
504 Gateway Time-out
生成此查询
public function api_prevnames()
{
if (Auth::user()->repeat_vistor == 'Y') {
$names = DB::table('visitors')
->select(DB::raw('first_name,last_name,email,car_reg,OPTIN,vistor_company'))
->where('user_id', Auth::user()->id)
->where('hidden', 0)
->where('email', '<>', '')
->whereRaw('id IN (select MAX(id) FROM visitors GROUP BY first_name, last_name, email)')
->get();
}
return JSONResponseGenerator::successResponse($names->toArray());
}
之前的代码运行时间不到几秒钟,我已在下面添加:
select first_name,last_name,email,car_reg,OPTIN,vistor_company from `visitors` where `user_id` = '439' and `hidden` = '0' and `email` <> '' and id IN (select MAX(id) FROM visitors GROUP BY first_name, last_name, email)
答案 0 :(得分:1)
您可以尝试运行以下内容:
SELECT
first_name,
last_name,
email,
car_reg,
OPTIN,
vistor_company
FROM (
SELECT
MAX(id) AS id
FROM `visitors`
WHERE
`user_id` = 439
AND `hidden` = 0
AND `email` <> ''
GROUP BY
first_name,
last_name,
email
) AS subQ
NATURAL JOIN `visitors`;
加入通常比其他方式更快,但我不认为它会有所帮助,因为你显然没有按索引进行分组。要做到这一点,你必须改变结构,我强烈建议这样做。尝试减少first_name,last_name和email的最大长度,以便创建这三者的组合索引。如果您可以更改数据库结构本身而不会占用系统的一半,则应该考虑将此表标准化为具有访问者表和另一个访问者访问者(与外键的关系),因此您可以通过键进行分组用三个未编制索引的字符串进行分组。