이 표를 살펴보십시오.
mysql> desc s_p;
+-------------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| s_pid | int(10) unsigned | YES | MUL | NULL | |
| sm_id | int(10) unsigned | YES | MUL | NULL | |
| m_id | int(10) unsigned | YES | | NULL | |
| created | datetime | YES | | NULL | |
| s_date | datetime | YES | | NULL | |
| estimated_date | datetime | YES | MUL | NULL | |
+-------------------------+------------------+------+-----+---------+----------------+
이제 다음 쿼리를 살펴보십시오.
mysql> select count(*) from s_p where estimated_date is null;
+----------+
| count(*) |
+----------+
| 190580 |
+----------+
1 row in set (0.05 sec)
mysql> select count(*) from s_p where estimated_date is not null;
+----------+
| count(*) |
+----------+
| 35640 |
+----------+
1 row in set (0.07 sec)
mysql> select count(*) from s_p;
+----------+
| count(*) |
+----------+
| 1524785 |
+----------+
위의 개수가 일치하지 않습니다. 내 이해에 따라 :
Where 절없이 쿼리 할 때 Count with IS NULL
및 Count with IS NOT NULL
는 count와 같아야합니다.
여기서 무슨 일이 일어나고 있는지 아십니까?
===================================================== =
2012 년 2 월 17 일 업데이트
이후 많은 사람들이 추정 된 날짜가 현재 가지고있는 가치에 대해 묻는다는 것을 알았습니다. 답은 다음과 같습니다.
mysql> select distinct date(estimated_date) from s_p;
+----------------------+
| date(estimated_date) |
+----------------------+
| NULL |
| 2012-02-17 |
| 2012-02-20 |
| 2012-02-21 |
| 2012-02-22 |
| 2012-02-23 |
| 2012-02-24 |
| 2012-02-27 |
| 2012-02-28 |
+----------------------+
9 rows in set (0.42 sec)
위에서 볼 수 있듯이 추정 된 날짜는 NULL 또는 유효한 날짜 시간 값을 갖습니다. 0 또는 빈 문자열 ""이 없습니다.
추정 날짜의 색인에 문제가있는 경우이 문제가 발생할 수 있습니까?
===================================================== =
2012 년 2 월 18 일 업데이트
다음은 show create 테이블 출력입니다.
| s_p | CREATE TABLE `s_p` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`s_id` int(10) unsigned DEFAULT NULL,
`sm_id` int(10) unsigned DEFAULT NULL,
`m_id` int(10) unsigned DEFAULT NULL,
`created` datetime DEFAULT NULL,
`estimated_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `sm_id` (`sm_id`),
KEY `estimated_date_index` (`estimated_date`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=1602491 DEFAULT CHARSET=utf8 |
다시 한 번, 여기서는 추정 날짜의 색인 만 의심 할 수 있습니다.
또한 mysql 서버 버전은 5.5.12입니다.
select count(*)
것이 select count(estimated_date)
아닌가? 이 두 가지가 계산하는 유일한 경우 NULL이 무시되므로 다른 결과를 반환합니다.
SELECT COUNT(*),SUM(CASE WHEN estimated_date IS NULL THEN 1 ELSE 0 END),SUM(CASE WHEN estimated_date IS NOT NULL THEN 1 ELSE 0 END) from s_p
모든 수를 가져와야합니다.
CHECK TABLE
수 있습니까? 엄청나게 큰 전체 행 수를 고려하면 DELETE
어딘가에 미친 듯합니다.