Xin vui lòng xem bảng này:
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 | |
+-------------------------+------------------+------+-----+---------+----------------+
Bây giờ hãy xem các truy vấn sau:
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 |
+----------+
Số lượng ở trên không phù hợp. Trong khi theo sự hiểu biết của tôi:
Đếm với IS NULL
và Đếm với IS NOT NULL
nên bằng với đếm khi được truy vấn mà không có mệnh đề where.
Bất cứ ý tưởng về những gì đang xảy ra ở đây?
================================================== = =
Cập nhật vào ngày 17 tháng 2 năm 2012
Kể từ đó, tôi thấy rằng rất nhiều người đang hỏi về loại giá trị ước tính hiện có. Đây là câu trả lời:
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)
Như bạn có thể thấy ước tính ở trên có NULL hoặc giá trị datetime hợp lệ. Không có số không hoặc chuỗi trống "".
Điều này (vấn đề ban đầu) có thể xảy ra nếu chỉ mục trên valu_date có một số vấn đề / s không?
================================================== = =
Cập nhật vào ngày 18 tháng 2 năm 2012
Dưới đây là chương trình tạo bảng đầu ra:
| 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 |
Một lần nữa, tôi chỉ có thể nghi ngờ chỉ số trên ước tính tại đây.
Ngoài ra, phiên bản máy chủ mysql là 5.5.12.
select count(*)
và không select count(estimated_date)
? Hai cái này sẽ trả về các kết quả khác nhau vì NULL bị bỏ qua nếu đó là điều duy nhất bạn đang đếm.
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
- sẽ nhận được tất cả số đếm trong một lần.
CHECK TABLE
trên nó không? Xét một cách hoang dại đếm đầy đủ hàng lớn hơn, tôi đoán một DELETE
đi đâu đó điên.