我有以下两个要加入的表格
我正在使用mysql v.5.7
表:接触约500万
id:auto inc(int)主键
状态:整数(索引)
表:contact_lists约一千万
id:auto inc(int)主键
contactId:索引
listId:索引
表:列出约30
id:auto inc(int)主键
这是我的查询,我的联系人表上有1000万条记录
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
最佳答案
根据您的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`);
请注意,进行这些更改可能会锁定您的表一段时间