错误可以在下图中看到。有效地运行完全相同的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;
###其他细节和注意事项
这是在mysql的亚马逊rds上。引擎:mysql 5.6.37 db示例类:db.t2.medium
救命
如果你直接给我留言或在下面发帖,我可以为你提供访问数据库的权限,让你尝试和玩数据集。
2条答案
按热度按时间xn1cxnb41#
我能看到同一个查询返回两个不同结果集的唯一方法是,不知何故,底层数据正在被更改。显而易见的原因可能是,当您运行同一查询两次时,在这两个查询之间添加/删除了数据。
然而,在aws的情况下,有另一种解释。如果数据库示例在逻辑上跨rds复制,那么第一个查询可能会在新添加/删除的数据跨rds复制之前命中数据库。也就是说,您的查询实际上可能是针对一个稍微过时的数据库执行的。
cedebl8k2#
我也有同样的问题。。。最多1000件就可以了。。。我怀疑问题出在mariadb驱动程序上,我用的是最新的https://github.com/mariadb-corporation/mariadb-connector-c 在我的例子中,下划线db是memsql。使用他们的网络界面我没有问题,现在我限制1000条记录