Mysql 有没有办法在myisam中使用where条件进行快速不准确计数(*)?
我有一个包含1.5亿行的表,其定义如下:Mysql 有没有办法在myisam中使用where条件进行快速不准确计数(*)?,mysql,myisam,Mysql,Myisam,我有一个包含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=154505
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
从任务中选择count(*),其中done=1代码>需要20秒
我不太关心确切的值:把它四舍五入到最接近的百万是没有问题的。有没有一种方法可以使查询少一些,但速度更快? < P>如果你尝试过索引,并且不能加速,升级硬件(RAM,SSD,无论如何)不是一种选择,那么就考虑某种形式的“架构”方法:例如,记录一个可以在第二天查找的计数的夜间快照。这是否足够准确
编辑:或,每小时,或任何频率工作 在done
上添加索引,如下所示:altertable任务添加索引(done)
@ojovirtual Key是索引的同义词<代码>键通常是索引的同义词。在列定义中给定键属性主键时,也可以将其指定为仅键。这是为了与其他数据库系统兼容而实现的。
@BenSwinburne-oopsss,对不起,伙计,没有看到!如果数据是随机的,那么您可以计算done=1的概率
,然后概率*totalnum
将使您到达那里