我有以下两个要加入的表 我正在使用mysql v。5.7
表格:联系人约500万
id:汽车公司(int)主键
状态:整数(索引)
表:contact_lists 约1000万
id:汽车公司(int)主键
contactId:索引
listId:索引
表格:列表约30
id:auto inc(int)主键
SELECT cl.listId, count(c.id) active from `contact_lists` cl
LEFT JOIN `contacts` c ON c.id = cl.contactId and c.status = 1
group by cl.listId
这是我的解释
1 SIMPLE cl NULL listId contact_lists 8 NULL 9062524 100.00 Using index
1 SIMPLE c NULL eq_ref PRIMARY PRIMARY 4 cl.contactId 1 100.00 Using where
运行该查询需要花费11秒钟的时间,不知道如何加快查询速度
我尝试添加索引没有任何实际效果,我可以以某种方式重写它以使其更快吗?不到2秒,问题是计数到这么多数据时count(c.id)非常慢
结果
listId. active
1 100
2. 3000
3. 500010
and so on
答案 0 :(得分:0)
根据您的Explain
结果,没有ID和状态的索引。创建这些:
ALTER TABLE `contact`
ADD INDEX `id_status` (`id`, `status`);
而且您还需要在contact_list上使用外键:
ALTER TABLE `contact_list`
ADD CONSTRAINT `FK_contact_list_contact` FOREIGN KEY (`contactId`) REFERENCES `contact` (`id`);
请注意,进行这些更改可能会锁定您的表一段时间