Точно такой же MYSQL Query, последовательно возвращает два разных результата - PullRequest
0 голосов
/ 27 ноября 2018

Ошибка видна на рисунке ниже.Эффективно выполняя точно такой же SQL-запрос, вы получите два разных ответа здесь .

mysql> select * from BTC_USDT_binance where id >= 56057162 and id < 56057791 and bidAsk = 1 order by id asc limit 2000;
Empty set (0.00 sec)

mysql> select * from BTC_USDT_binance where id >= 56057162 and id <     56057791 and bidAsk = 1 order by id asc limit 2000;
+----------+------------------------+---------+----------+--------+-------+
| id       | date                   | price   | volume   | bidAsk | reset |
+----------+------------------------+---------+----------+--------+-------+
| 56057163 | 2018-11-27 00:49:46.63 | 3848.26 | 0.201554 |       |           |
| 56057164 | 2018-11-27 00:49:46.63 | 3835.31 |        0 |       |       |
| 56057168 | 2018-11-27 00:49:47.64 | 3848.27 |      2.1 |       |       |
| 56057175 | 2018-11-27 00:49:48.64 |  3848.3 | 0.086733 |       |       |
| 56057176 | 2018-11-27 00:49:48.64 | 3848.27 |        0 |       |       |
| 56057177 | 2018-11-27 00:49:48.64 | 3848.31 | 0.085672 |       |       |

Второе изображение, чтобы продемонстрировать это:

mysql> select COUNT(*) from BTC_USDT_binance where id >= '56057162' and id < '56057791' and bidAsk = 0;
+----------+
| COUNT(*) |
+----------+
|      316 |
+----------+
1 row in set (0.00 sec)

mysql> select COUNT(*) from BTC_USDT_binance where id >= '56057162' and id < '56057791' and bidAsk = 0;
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

mysql> select COUNT(*) from BTC_USDT_binance where id >= '56057162' and id < '56057791' and bidAsk = 0;
+----------+
| COUNT(*) |
+----------+
|      316 |
+----------+
1 row in set (0.00 sec)

mysql> select COUNT(*) from BTC_USDT_binance where id >= '56057162' and id < '56057791' and bidAsk = 0;
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+
1 row in set (0.01 sec)

mysql> select COUNT(*) from BTC_USDT_binance where id >= '56057162' and id < '56057791' and bidAsk = 0;
+----------+
| COUNT(*) |
+----------+
|      316 |
+----------+
1 row in set (0.00 sec)

Примечания / Замечания по этому вопросу:

Я отключил другие соединения, не сохраняю в таблице ввсе.Это происходит последовательно друг с другом - это означает, что если я выполню его один раз, он вернет один результат (обычно большой запрос / результат из нескольких тысяч ответов), а если я сделаю запрос еще раз, он вернет другой (одну запись).

Обратите внимание, что это не связано с ограничениями пространства на первичном ключе или чем-либо связанным с этим.Схема базы данных выглядит следующим образом: здесь .

mysql> describe BTC_USDT_binance;
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| id     | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| date   | timestamp(2)        | YES  |     | NULL    |                |
| price  | float               | YES  |     | NULL    |                |
| volume | float               | YES  |     | NULL    |                |
| bidAsk | bit(1)              | YES  |     | NULL    |                |
| reset  | bit(1)              | YES  |     | NULL    |                |
+--------+---------------------+------+-----+---------+----------------+

Количество хаков

Если вы ограничите количество извлекаемых записей (т. Е. Извлекаете только 100 записей одновременно),проблема уходит.Это происходит примерно до 1000 записей.Это можно легко увидеть / воспроизвести, запустив (изменяя значение N):

select * from BTC_USDT_binance where id >= 56057162 and id < 56057791 and bidAsk = 1 order by id asc limit N;

Если вместо этого вы используете только одностороннюю величину больше, чем и используете ограничение,проблема уходит также.Это видно по:

select * from BTC_USDT_binance where id >= 56057162 and bidAsk = 1 order by id asc limit 500;

Прочие сведения и примечания

Это на Amazon RDS mysql.Движок: MySQL 5.6.37 Класс экземпляра БД: db.t2.medium

Help

Если вы отправите мне сообщение или напишете ниже, я могу предоставить вам доступ к базе данных, чтобы вы могли попробовать и сыгратьвокруг с наборами данных.

1 Ответ

0 голосов
/ 27 ноября 2018

Единственный способ увидеть один и тот же запрос, возвращающий два разных набора результатов, - это изменить базовые данные.Очевидная причина может заключаться в том, что данные добавляются / удаляются между ними, когда вы выполняете один и тот же запрос дважды.

Однако в случае AWS есть другое объяснение.Если ваш экземпляр базы данных логически реплицируется через RDS, то, возможно, первый запрос попадет в базу данных до того, как вновь добавленные / удаленные данные будут реплицированы через RDS.То есть ваш запрос может выполняться к слегка устаревшей базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...