我有一个如下的查询,请帮助给出适当的索引,联系表有超过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
答案 0 :(得分:0)
您可以尝试以下步骤
user_id
,contact_id
和industry_id
添加索引(我希望这些ID正在加入表primary_keys)user_id
,contact_id
和industry_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