2017-09-20 118 views
1

我正在使用使用proxysql的ndb集羣設置。有4個mysql服務器,4個數據節點和2個管理節點。當我直接訪問某個mysql服務器時會發生以下情況,所以我認爲我可以安全地排除proxysql作爲根本原因,但除此之外,我只是丟失了。返回的MySQL查詢結果是半隨機的/不一致的有序

這裏有一個表我建立了幫助說明我的問題:

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) 

它包含以下數據;請注意,我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 clause)我每次都會得到不同的訂單。它似乎並不是真正的隨機,但是肯定的是,對我而言,這並不是什麼可辨別的模式。

這是怎麼發生的?我對mysql的經驗總是默認的排序主要是根據主鍵,但這也是我第一次特別使用ndb集羣;我不知道這裏是否有區別,或者是否有配置文件中的設置被忽略或者什麼。任何幫助是極大的讚賞!

+2

正如你剛纔所意識到的,除非你指定了順序,否則在每個數據庫行中都不是有序的數據集。順序可能因索引,羣集,磁盤分區等而異。只是數據庫以最有效的方式收集請求的數據。而且因爲你沒有設置'ORDER BY',所以他沒有努力訂購它,並且每次都可以得到不同的結果。 –

+0

這很有道理,並且當我嘗試找出解決方案時遇到的其他信息與我之前遇到的其他信息相似,但根據我以前的經驗,這似乎是違反直覺的。它肯定只是確認偏見,環境差異或類似情況,我想我不能依靠找到更廣泛的,一刀切的解決方案。 非常感謝您的快速響應! – loungehead

+0

由於您沒有指定'ORDER BY'子句,因此它不應該以您得到結果的順序來打擾您。如果您需要訂單,請使用'ORDER BY'子句,因爲這是保證排序結果的唯一方法。一旦查詢在並行線程中執行,結果順序變得非常典型,因爲查詢的每次執行都不會有'ORDER BY'而變化。 –

回答

1

這是標準的SQL行爲。

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

可以有選擇地出現查詢表達式後的ORDER BY子句:它指定的命令行應該從查詢返回時(如果省略該子句,你的DBMS將返回以某種隨機順序排列的行)

(重點煤礦)

它會更準確的說,這將在一定任意順序返回,而不是隨機順序列。隨機意味着訂單將從一次執行更改爲下一次。

  • 對於InnoDB,順序往往是行訪問的索引順序。它讀取的索引不一定是主鍵。所以如果你知道內部的一些東西,那麼順序是不變的,並且有點可預測。但它不是隨機的。

  • 在MyISAM的情況下,訂單往往是行存儲在表中的順序,根據行插入的順序不同,也取決於文件中存在空間的位置在行刪除之後插入的時間。

  • 在NDB的情況下,我不太瞭解它的內部,所以我不能描述它的默認順序的規則,但沒有明確的ORDER BY也是如此,存儲引擎是允許以任何順序返回行。

+0

我想我可以非常自信地說,直到我們把這個集羣放在一起,我總是使用InnoDB,根據你在第一個要點上說的話,它會解釋爲什麼這會引發我這樣的循環。那麼,如果事情是這樣的話,那就這樣吧 - 我的代碼將適應環境,而不是相反。 – loungehead

0

對於NDB,訂單取決於在 的情況下的計時SELECT * from table;

來自表的SELECT *實現爲並行 在數據節點及其數據庫中的全表掃描 線程與一個 MySQL線程接收結果。

因此,使用篩選查詢如 SELECT * from table where filter_column = 2; 篩選器在多個線程中並行進行評估。 這些線程中的每一個以任何 的順序將行返回給MySQL線程,這取決於OS調度程序,網絡和許多其他事情。所以沒有默認排序,除非你使用ORDER BY。

因此對於NDB順序是真正的隨機性,而不僅僅是任意的。 您會在使用MTR的所有NDB測試套件中看到這一點, 查詢主要使用來自表ORDER BY some_field的SELECT *