Mysql 使用where子句的索引对distinct(count(ColumnName))是否需要索引?

Mysql 使用where子句的索引对distinct(count(ColumnName))是否需要索引?,mysql,indexing,sql,query-performance,Mysql,Indexing,Sql,Query Performance,我有一张这样的桌子 Subscribers Id (PK, int) OwnedBy (FK, int) EmailAddress (varchar 50) 如果我这样问: SELECT COUNT(DISTINCT(EmailAddress)) FROM Subscribers WHERE Subscribers.OwnedBy = 67; SELECT COUNT(*) FROM Subscribers WHERE Subscribers.OwnedBy = 67 GROUP

我有一张这样的桌子

Subscribers
  Id (PK, int)
  OwnedBy (FK, int)
  EmailAddress (varchar 50)
如果我这样问:

SELECT COUNT(DISTINCT(EmailAddress))
FROM Subscribers
WHERE Subscribers.OwnedBy = 67;
SELECT COUNT(*)
FROM Subscribers
WHERE Subscribers.OwnedBy = 67
GROUP BY EmailAddress

OwnedBy
列上有一个索引。假设表非常大,我是否也应该索引
电子邮件地址
?我不担心写性能下降。

您应该创建覆盖索引,使其更快

ALTER TABLE Subscribers ADD KET ix1(OwnedBy, EmailAddress);
将状态检查为“使用何处使用索引”以执行此查询:

EXPLAIN SELECT COUNT(DISTINCT(EmailAddress))
FROM Subscribers
WHERE Subscribers.OwnedBy = 67;
是的,你应该

因为您的查询可以这样重写:

SELECT COUNT(DISTINCT(EmailAddress))
FROM Subscribers
WHERE Subscribers.OwnedBy = 67;
SELECT COUNT(*)
FROM Subscribers
WHERE Subscribers.OwnedBy = 67
GROUP BY EmailAddress
您应该看看MySQL
groupby
performance optimization页面:

在这里,声明如下:

The most efficient way to process GROUP BY is when an index is used to 
directly retrieve the grouping columns

因此,如果您不关心插入/更新性能和表的大小,那么您一定应该在
电子邮件地址上使用索引,谢谢。你能评论一下你的解决方案和Omesh提到的创建覆盖索引吗?也许这会对你有所帮助