Mysql count()与Left Join在5百万条记录上耗时超过10秒

时间:2019-03-02 00:40:44

标签: mysql

我有以下两个要加入的表 我正在使用mysql v。5.7

表格:联系人约500万

id:汽车公司(int)主键

状态:整数(索引)

表:contact_lists 约1000万

id:汽车公司(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 

1 个答案:

答案 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`);

请注意,进行这些更改可能会锁定您的表一段时间