我正在使用使用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)
如果我没有指定order子句,返回的结果看起来是随机的,例如:
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子句)时,几乎每次都得到不同的排序。这似乎不是真正随机的,但在我看来确实没有任何可识别的模式。
为什么会这样?我在mysql中的经验是,默认的顺序基本上是根据主键进行的,但这也是我第一次特别使用ndb集群;我不知道这是否有区别,或者配置文件中是否有设置丢失或什么。非常感谢您的帮助!
最佳答案
这是标准的SQL行为。
https://mariadb.com/kb/en/library/sql-99/order-by-clause/部分地说:ORDER BY
子句可以选择性地出现在查询表达式之后:它指定从该查询返回的行的顺序(如果省略该子句,DBMS将以某种随机顺序返回行)。
(强调我的)
更准确地说,它将以任意顺序返回行,而不是随机顺序。随机意味着顺序将从一次执行更改为下一次执行。
对于InnoDB,顺序往往是访问行的索引顺序。它读取的索引不一定是主键。因此,如果你了解了其中的一些内容,这个顺序是不变的,而且是可以预测的。但这不是随机的。
在MyISAM中,顺序往往是行在表中的存储顺序,这取决于行插入的顺序,也取决于行删除后插入时文件中的空间位置。
在NDB的例子中,我不太了解它的内部结构,所以我无法描述它的“默认”顺序规则,但是如果没有显式的ORDER BY
,存储引擎可以按它希望的顺序返回行,这仍然是事实。