完全相同的MYSQL查询,一致地返回两个不同的结果

时间:2018-11-27 01:46:52

标签: python mysql amazon-web-services

在下图中可以看到错误。有效地运行完全相同的sql查询,将返回两个不同的响应here

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)

关于此的注释/观察:

我关闭了其他连接,根本没有存储到表中。它每隔一贯发生一次-表示如果我运行一次,它将返回一个结果(通常是大查询/成千上万个响应的结果),如果我再次查询,它将返回另一个结果(一条记录)

请注意,这与主键上的空间限制无关,也与此无关。数据库架构如下here

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;

其他详细信息和注释

这是在mysql的Amazon RDS上。 引擎:MySQL 5.6.37 数据库实例类:db.t2.medium

帮助

如果您直接给我发消息或在下面发帖,我可以为您提供对数据库的访问权限,以便您尝试使用数据集。

2 个答案:

答案 0 :(得分:1)

我可以看到相同的查询返回两个不同结果集的唯一方法是,是否以某种方式更改了基础数据。显而易见的原因可能是两次运行同一查询之间是否在两次数据之间添加/删除数据。

但是,对于AWS,还有另一种解释。如果您的数据库实例在逻辑上跨RDS复制,则在跨RDS复制新添加/删除的数据之前,第一个查询可能会命中数据库。也就是说,您的查询实际上可能是针对稍微过时的数据库执行的。

答案 1 :(得分:0)

我遇到了同样的问题...限制为1000可以正常工作...我怀疑问题出在mariadb驱动程序上,即时通讯使用最新的https://github.com/mariadb-corporation/mariadb-connector-c 在我的情况下,下划线数据库是memsql。使用他们的Web界面,我没有问题,目前限制了1000条记录