У меня есть несколько серверов. Некоторым из них назначен ips. Я хочу выяснить, сколько нет. Очевидно, что серверов больше, чем назначенных ips, но моя база данных сообщает, что нет серверов, для которых не назначен ips ...
Я нахожусь в конце моего остроумия здесь. Моя БД повреждена каким-то странным образом?
SELECT COUNT(*)
FROM server
... возвращается:
+----------+
| count(*) |
+----------+
| 23088 |
+----------+
1 row in set (0.00 sec)
Это:
SELECT COUNT(*)
FROM server
WHERE server_id IN (SELECT DISTINCT(server_id)
FROM ips)
... возвращается:
+----------+
| count(*) |
+----------+
| 13811 |
+----------+
1 row in set (0.01 sec)
Это:
SELECT COUNT(*)
FROM server
WHERE server_id NOT IN (SELECT DISTINCT(server_id)
FROM ips);
... возвращается:
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.02 sec)
Результаты были отредактированы, чтобы защитить виновных, но вы поняли идею.
- Все таблицы InnoDB.
Check table
возвращается нормально в обеих таблицах.
РЕДАКТИРОВАТЬ: спасибо за предложение использовать LEFT JOIN
. Это определенно подтверждает, что проблема заключается в ошибке MySQL.
mysql> SELECT count(s.server_id) FROM server s LEFT JOIN ips i on s.server_id = i.server_id WHERE i.server_id IS NULL;
+--------------------+
| count(s.server_id) |
+--------------------+
| 9277 |
+--------------------+
1 row in set (0.04 sec)
Начиная с 9277 + 13811 = 23088, это означает, что все серверы без ips + все серверы с ips действительно == все серверы.
Я запланировал обновление сервера mysql на начало следующей недели. Оставайтесь с нами.