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

inkz8wg9  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(422)

错误可以在下图中看到。有效地运行完全相同的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

救命

如果你直接给我留言或在下面发帖,我可以为你提供访问数据库的权限,让你尝试和玩数据集。

xn1cxnb4

xn1cxnb41#

我能看到同一个查询返回两个不同结果集的唯一方法是,不知何故,底层数据正在被更改。显而易见的原因可能是,当您运行同一查询两次时,在这两个查询之间添加/删除了数据。
然而,在aws的情况下,有另一种解释。如果数据库示例在逻辑上跨rds复制,那么第一个查询可能会在新添加/删除的数据跨rds复制之前命中数据库。也就是说,您的查询实际上可能是针对一个稍微过时的数据库执行的。

cedebl8k

cedebl8k2#

我也有同样的问题。。。最多1000件就可以了。。。我怀疑问题出在mariadb驱动程序上,我用的是最新的https://github.com/mariadb-corporation/mariadb-connector-c 在我的例子中,下划线db是memsql。使用他们的网络界面我没有问题,现在我限制1000条记录

相关问题