有什么方法可以在 myisam 中使用 where 条件进行快速不准确的计数(*)?
Is there any way to do a fast inaccurate count(*) with a where condition in myisam?
我有一个 table 有 1.5 亿行,定义如下:
CREATE TABLE `tasks` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`task` varchar(255) NOT NULL,
`done` tinyint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `done` (`done`)
) ENGINE=MyISAM AUTO_INCREMENT=154505834 DEFAULT CHARSET=utf8
select count(*) from tasks where done = 1;
需要 20 秒。
我不太关心确切的值:将它四舍五入到最接近的百万没有问题。有没有办法让 less 查询的准确性降低,但速度更快?
如果您已尝试建立索引但无法加快速度,并且升级硬件(RAM、SSD 等)不是一种选择,请考虑某种形式的 "architecture" 方法:例如记录您可以在第二天查找的每晚计数快照?这够准确吗?
编辑:或者,每小时,或者任何有效的频率!
我有一个 table 有 1.5 亿行,定义如下:
CREATE TABLE `tasks` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`task` varchar(255) NOT NULL,
`done` tinyint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `done` (`done`)
) ENGINE=MyISAM AUTO_INCREMENT=154505834 DEFAULT CHARSET=utf8
select count(*) from tasks where done = 1;
需要 20 秒。
我不太关心确切的值:将它四舍五入到最接近的百万没有问题。有没有办法让 less 查询的准确性降低,但速度更快?
如果您已尝试建立索引但无法加快速度,并且升级硬件(RAM、SSD 等)不是一种选择,请考虑某种形式的 "architecture" 方法:例如记录您可以在第二天查找的每晚计数快照?这够准确吗?
编辑:或者,每小时,或者任何有效的频率!