返回的MySQL查询结果是半随机/不一致的

时间:2017-09-20 19:43:23

标签: mysql sql-order-by mysql-cluster

我正在使用使用proxysql的ndb群集设置。有4个mysql服务器,4个数据节点和2个管理节点。当我直接访问其中一个mysql服务器时会发生以下情况,因此我认为我可以安全地排除proxysql作为根本原因,但除此之外,我只是丢失了。

这是我设置的一个表格,用于帮助说明我的问题:

mysql> describe delain;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| album_id | tinyint(2)  | NO   | PRI | NULL    | auto_increment |
| album    | varchar(30) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

它包含以下数据;请注意我指定了一个order by子句:

mysql> select * from delain order by album_id;
+----------+-------------------------+
| album_id | album                   |
+----------+-------------------------+
|        1 | Lucidity                |
|        2 | April Rain              |
|        3 | We Are the Others       |
|        4 | The Human Contradiction |
|        5 | Moonbathers             |
+----------+-------------------------+
5 rows in set (0.00 sec)

如果我没有指定订单子句,则返回的结果看似随机,例如:

mysql> select * from delain;
+----------+-------------------------+
| album_id | album                   |
+----------+-------------------------+
|        3 | We Are the Others       |
|        5 | Moonbathers             |
|        1 | Lucidity                |
|        2 | April Rain              |
|        4 | The Human Contradiction |
+----------+-------------------------+
5 rows in set (0.00 sec)

当我重复查询(sans order clause)时,我每次都会得到不同的排序。它似乎并不是真正的随机,但确实对我来说不是任何可辨别的模式。

为什么会这样?我对mysql的经验一直是默认排序基本上是根据主键,但这也是我第一次特别使用ndb集群;我不知道那里是否存在差异,或者配置文件中是否存在错过的设置或者什么。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

这是标准的SQL行为。

https://mariadb.com/kb/en/library/sql-99/order-by-clause/部分说:

  

ORDER BY子句可以选择出现在查询表达式之后:它指定从该查询返回时的行应该具有的顺序(如果省略该子句,则DBMS将以某种随机顺序返回行)即可。

(强调我的)

更准确的说它会以某些任意顺序返回行,而不是随机顺序。随机意味着订单将从一次执行变为下一次执行。

  • 在InnoDB的情况下,顺序往往是访问行的索引顺序。它读取的索引不一定是主键。因此,如果你对内部结构有所了解,那么顺序是不变的,有些可预测。但这不是随意的。

  • 在MyISAM的情况下,顺序往往是行存储在表中的顺序,这可以根据插入行的顺序而变化,也取决于文件中存在空间的位置在插入时,在删除行之后。

  • 在NDB的情况下,我不太了解它的内部结构,因此我无法描述其“默认”顺序的规则,但如果没有明确的ORDER BY,它仍然是正确的,允许存储引擎以任何顺序返回行。

答案 1 :(得分:0)

对于NDB,顺序取决于a的时间 SELECT * from table;

表中的SELECT *实现为并行化 数据节点及其数据库中的全表扫描 一个线程 MySQL线程接收结果。

所以使用过滤后的查询 SELECT * from table where filter_column = 2; 过滤器在许多线程中并行计算。 每个线程都将行返回到任何MySQL线程 依赖于OS调度程序,网络和许多的顺序 其他事情。所以除非你没有默认排序 使用ORDER BY。

因此,对于NDB,订单是真正随机的,而不仅仅是任意的。 您将在使用MTR的所有NDB测试套件中看到这一点 查询主要使用SELECT * from table ORDER BY some_field;