2016-11-01 21 views
-1

當通過對MariaDB 10.1.18有限制的查詢運行訂單時,我得到錯誤的訂單。MariaDB 10.1訂單+限制不一致

觀察查詢沒有LIMIT聲明:

select advert_id, published, id from vacancies order by published asc; 

+-----------+-----------+----+ 
| advert_id | published | id | 
+-----------+-----------+----+ 
| 328377 |   0 | 70 | 
| 328844 |   0 | 80 | 
| 325263 |   0 | 41 | 
| 325774 |   0 | 40 | 
| 325775 |   0 | 39 | 
| 325929 |   0 | 38 | 
| 325885 |   0 | 37 | 
| 325901 |   0 | 36 | 
| 325920 |   0 | 35 | 
| 325917 |   0 | 34 | 
| 325922 |   0 | 33 | 
| 325889 |   0 | 32 | 
| 325927 |   0 | 31 | 
| 325238 |   0 | 43 | 
| 325244 |   0 | 45 | 
| 328365 |   0 | 71 | 
| 328446 |   0 | 72 | 
| 328362 |   0 | 68 | 
| 323602 |   0 | 55 | 
| 324250 |   0 | 54 | 
| 324254 |   0 | 53 | 
| 324911 |   0 | 52 | 

與限位聲明:

select advert_id, published, id from vacancies order by published asc limit 10; 

+-----------+-----------+----+ 
| advert_id | published | id | 
+-----------+-----------+----+ 
| 327830 |   0 | 1 | 
| 326865 |   0 | 18 | 
| 327328 |   0 | 9 | 
| 326877 |   0 | 16 | 
| 326783 |   0 | 21 | 
| 326779 |   0 | 17 | 
| 326774 |   0 | 15 | 
| 326864 |   0 | 20 | 
| 326788 |   0 | 14 | 
| 326767 |   0 | 19 | 
+-----------+-----------+----+ 

順序由發表在兩個不同的查詢。

爲了便於比較,我在MariaDB 5.5.50上運行了相同的查詢,並通過+ limit正確返回與查詢順序相同的結果。所以從我的理解是這個問題是MariaDB特定的,只存在於較新的版本。

此外,我還運行了相同的查詢,但在具有許多不同值的varchar字段上排序,在這種情況下,順序是正確的。所以我認爲這個問題只適用於對具有很多相同值的字段進行限制排序。

有誰知道是否有解決方法? MariaDB中的設置可能是?

FYI:

表結構:

+------------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+------------------+------------------+------+-----+---------+----------------+ 
| id    | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| advert_id  | int(11)   | YES |  | NULL |    | 
| published  | tinyint(1)  | NO |  | 0  |    | 
| (other fields omitted) 

說明上查詢:

explain select advert_id, published, id from vacancies order by published asc; 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra   | 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 
| 1 | SIMPLE  | vacancies | ALL | NULL   | NULL | NULL | NULL | 52 | Using filesort | 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 

explain select advert_id, published, id from vacancies order by published asc limit 10; 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra   | 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 
| 1 | SIMPLE  | vacancies | ALL | NULL   | NULL | NULL | NULL | 52 | Using filesort | 
+------+-------------+-----------+------+---------------+------+---------+------+------+----------------+ 

版本與秩序的問題:

mysql Ver 15.1 Distrib 10.1.18-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 

版本沒有秩序的問題:

mysql Ver 15.1 Distrib 5.5.50-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 
+1

但是'published'始終爲'0' –

+0

您應該在指定時指定要使用的_all_列。 –

+0

@juergend是的,但有記錄它是1.問題是,當我使用MariaDB在分頁中使用的這種隨機排序時,有些記錄就不會顯示。 – Jones03

回答

3

您不指定要獲取哪十個第一行。由於有很多行,其中published等於0 MariaDB可以自由選擇其中一些行。如果您想要特定訂單,請嘗試:

SELECT advert_id, published, id FROM vacancies ORDER BY published asc, id LIMIT 10; 
+0

謝謝,那就是訣竅。儘管MariaDB 5.5.50和10.1之間的差異仍然讓人困惑。但我想應該假定沒有保證,除非指定了第二個參數。 – Jones03