【发布时间】:2017-09-20 19:43:22
【问题描述】:
我正在使用使用 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)
当我重复查询(无顺序子句)时,几乎每次都会得到不同的顺序。它似乎并不是真正随机的,但对我来说确实没有任何可辨别的模式。
为什么会这样?我对mysql的经验一直是默认排序基本上是根据主键,但这也是我第一次特别使用ndb集群;我不知道那里是否有区别,或者配置文件中的设置是否丢失或什么。非常感谢任何帮助!
【问题讨论】:
-
正如您刚刚意识到的那样,除非您指定顺序,否则每个数据库中的行都不是有序的数据集。由于索引、集群、磁盘分区等,顺序可能会有所不同。只是数据库收集请求的数据是他能做到的最有效的方式。而且因为你没有设置
ORDER BY,所以他没有努力订购它,每次都会得到不同的结果。 -
这是有道理的,并且肯定与我在试图找出解决问题的方法时看到的其他信息相匹配,根据我之前的经验,这似乎违反直觉。它一定只是确认偏差、环境差异或类似的东西,我想我不能指望找到一个更广泛、一刀切的解决方案。非常感谢您的及时回复!
-
由于您没有指定
ORDER BY子句,因此它不应该打扰您获得结果的顺序。如果您需要订单,请使用ORDER BY子句,因为这是保证排序结果的唯一方法。一旦查询在并行线程中执行,对于没有ORDER BY的查询,结果顺序会随着每次执行而变化。
标签: mysql sql-order-by mysql-cluster