MYSQL GROUP BY - 慢查询

时间:2015-03-31 12:17:33

标签: mysql

我有一个如下的查询,请帮助给出适当的索引,联系表有超过20K的记录,加载需要将近20秒。 希望group by子句出现问题,如果我删除group by子句总记录超过300k。

SELECT `a`.*, CONCAT(a.`firstname`, " ", a.`lastname`) AS `cont_name`, CONCAT(a.`position`, " / ", a.`company`) AS `comp_pos`, `e`.`name` AS `industry_name`, CONCAT(f.`firstname`, " ", f.`lastname`) AS `created_by` 
FROM `contacts` AS `a` 
LEFT JOIN `user_centres` AS `b` ON a.user_id = b.user_id 
LEFT JOIN `group_contacts` AS `c` ON a.id = c.contact_id 
LEFT JOIN `groups` AS `d` ON c.group_id = d.id 
LEFT JOIN `industries` AS `e` ON e.id = a.industry_id 
LEFT JOIN `users` AS `f` ON f.id = a.user_id 
WHERE (1) 
GROUP BY `a`.`id` 
ORDER BY `a`.`created` desc

解释显示如下 - 20145使用临时;使用filesort

2 个答案:

答案 0 :(得分:0)

您可以尝试以下步骤

  1. 没有使用表组(d),因此您可以从此查询中删除左连接到组
  2. 在联系人表格中为user_idcontact_idindustry_id添加索引(我希望这些ID正在加入表primary_keys)
  3. 检查这些ID user_idcontact_idindustry_id类型(INT)是否相同。

答案 1 :(得分:0)

我们的要求如下

1)在admin login

中列出所有联系人

2)经理/职员登录中的联系人中心明智列表

联系表中的总记录是> 20K。

user_centres表中的用户将有多个条目,即:用户被分配到多个中心。

通过排除GROUP BY在服务器中执行查询时,差不多有3万个数据导致问题。

我已经详细检查了这个问题并简化了查询,如下所示,此处与user_centres表的连接是用于中心过滤数据。

SELECT `a`.*, CONCAT(a.`firstname`, " ", a.`lastname`) AS `cont_name`,
CONCAT(a.`position`, " / ", a.`company`) AS `comp_pos`, `e`.`name` AS `industry_name`,
CONCAT(f.`firstname`, " ", f.`lastname`) AS `created_by` FROM `contacts` AS `a`
LEFT JOIN `users` AS `f` ON f.id = a.user_id
LEFT JOIN `user_centres` AS `b` ON a.user_id = b.user_id
LEFT JOIN `industries` AS `e` ON e.id = a.industry_id
WHERE (b.centre_id IN (23, 24, 25, 26, 20, 21, 22, 27, 28))
GROUP BY `a`.`id` ORDER BY `a`.`created` desc

EXPLAIN将结果表示为: - 1 SIMPLE索引PRIMARY,user_id,area_id,industry_id,country PRIMARY 4 NULL 20145使用临时;使用filesort

请参阅屏幕以获取更多帮助

联络表 - http://prntscr.com/6o5gw4

user_centres表 - http://prntscr.com/6o5h30