MySQL 不同计数 - 非常慢

MySQL Count Distinct - Very Slow

我有一个非常大的 MySQL InnoDB table 具有以下结构:

TABLE `whois_records` (
  `record_id` int(10) unsigned NOT NULL,
  `domain_name` varchar(100) NOT NULL,
  `tld_id` smallint(5) unsigned DEFAULT NULL,
  `create_date` date DEFAULT NULL,
  `update_date` date DEFAULT NULL,
  `expiry_date` date DEFAULT NULL,
  `query_time` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

PRIMARY KEY (`record_id`)
UNIQUE KEY `domain_time` (`domain_name`,`query_time`)
INDEX `tld_id` (`tld_id`)

这个 table 当前有 1000 万行。 它存储经常更新的域名详细信息。 所以在table.

中同一个域名可以有多个记录

TLD ID 是域扩展类型的数值。

问题出在我试图计算特定 TLD 的域名总数时。

我尝试了以下 3 个 SQL 查询:

SELECT COUNT(DISTINCT(domain_name)) FROM `whois_records` WHERE tld_id=159
SELECT COUNT(*) FROM `whois_records` WHERE tld_id=159 GROUP BY domain_name
SELECT COUNT(*) FROM ( SELECT 1 FROM `whois_records` WHERE tld_id=159 GROUP BY domain_name) q

这 3 个都非常慢,需要 5 到 10 分钟。它也用掉了很多 CPU 来完成。 TLD ID 列上定义了 INDEX,因此这些查询可能会执行 FULL INDEX SCAN。它仍然很慢。 TLD ID 159 为“.com”,数量最多。所以在搜索 159 时,它是最慢的。对于域名少于 100 个的非热门 TLD,相同的查询大约需要 0.10 秒。 TLD ID 159 有大约 600 万条记录,占整个 table 1000 万行记录的 60%。

有没有优化计算的方法?

随着 table 的增长,当前查询将花费更长的时间。所以请任何人都可以帮助我为这个问题提供一个面向未来的解决方案。是否需要对 table 进行任何更改?请帮忙,谢谢:)

扩展索引以同时包含 domain_name

INDEX `tld_id` (`tld_id`, `domain_name`)

这应该使 MySQL 仅使用索引而不是 table 数据来计算结果。如果两个值的组合是唯一的,则添加一个新的唯一索引:

UNIQUE INDEX `new_index` (`tld_id`, `domain_name`)

我怀疑你能把它推得更远。如果还是不够快,考虑缓存计数器。