我已经按字段daynumber
对表进行了分区。在白天,我写入此表日志,然后计算一些统计数据。桌很大;每天我都有~3M新行。字段myField
已编入索引。
此查询
SELECT COUNT(DISTINCT myField) FROM mytable WHERE daynumber=somevalue;
返回0,这是一个错误。
此查询
SELECT COUNT(*) FROM (SELECT DISTINCT(myField) FROM mytable WHERE daynumber=somevalue) t;
返回正确的值。
对于某些daynumber
值,第一个查询可以正常工作。我试图重复该分区,但没有效果。有什么建议吗?
更新
表方案看起来像
CREATE TABLE `mytable` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`daynumber` INT(10) UNSIGNED NOT NULL,
`myField` VARCHAR(1024) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
... other fields
PRIMARY KEY (`daynumber`,`id`),
KEY `myField` (`myField`(20))
) ENGINE=MYISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
PARTITION BY LIST (daynumber)
(PARTITION day_810 VALUES IN (810) ENGINE = MyISAM,
PARTITION day_811 VALUES IN (811) ENGINE = MyISAM,
PARTITION day_812 VALUES IN (812) ENGINE = MyISAM
....)
答案 0 :(得分:4)
这是因为您的myfield
包含NULL
值
SELECT COUNT(DISTINCT coalesce(myField, '') )
FROM mytable WHERE daynumber=somevalue;
coalesce
有点NULL
转换为''
可能不是你要求的,但会返回正确的计数(仍然)
答案 1 :(得分:2)
让我们说'
1, 2, 2, NULL
因此,使用子查询有两个步骤。
SELECT DISTINCT(myField)
提供3行:1, 2, NULL
SELECT COUNT(*)
这给了3. 没有子查询,一步
SELECT COUNT(DISTINCT(myField))
仅计算1, 2
= 2 原因:
COUNT(*)
包含NULL COUNT(anythingelse)
不计算NULL 查询不能不一致,因为它们是不同的查询
我记得最好的讨论是DBA.SE: What is the difference between select count(*) and select count(any_non_null_col)?