我有以下两个要加入的表格
我正在使用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`);


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

10-06 14:25