前兩天在工作中遇到一個Mysql排序的問題,在沒有加order by的時候,獲取的資料順序是隨機的,而不是按照主鍵排序的。以往我都以往mysql的排序預設是按主鍵來排序的。這才發現其實不是這樣的。
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` char(100) DEFAULT NULL,
`age` char(5) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
建立一個測試資料庫
INSERT INTO test VALUES(NULL,`張三`,`5`);
INSERT INTO test VALUES(NULL,`李四`,`15`);
INSERT INTO test VALUES(NULL,`王五`,`5`);
INSERT INTO test VALUES(NULL,`趙信`,`15`);
INSERT INTO test VALUES(NULL,`德瑪`,`20`);
INSERT INTO test VALUES(NULL,`皇子`,`5`);
INSERT INTO test VALUES(NULL,`木木`,`17`);
INSERT INTO test VALUES(NULL,`好漢`,`22`);
INSERT INTO test VALUES(NULL,`水滸`,`18`);
INSERT INTO test VALUES(NULL,`小芳`,`17`);
INSERT INTO test VALUES(NULL,`老王`,`5`);
按照正常的主鍵遞增的順序插入一些資料SELECT * FROM test LIMIT 5
,然後查詢五條記錄
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | 張三 | 5 |
| 2 | 張三 | 5 |
| 3 | 李四 | 15 |
| 4 | 王五 | 5 |
| 5 | 趙信 | 15 |
+----+------+------+
5 rows in set (0.00 sec)
現在我們只查詢兩個欄位,id,age select id,age from test limit 5
;
+----+------+
| id | age |
+----+------+
| 3 | 15 |
| 5 | 15 |
| 8 | 17 |
| 11 | 17 |
| 10 | 18 |
+----+------+
5 rows in set (0.00 sec)
這個時候可以看到 兩次沒有使用order by
得到的查詢結果並不一樣。這個時候我們來分析下查詢語句
mysql> explain select * from test limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 12
Extra:
1 row in set (0.00 sec)
mysql> explain select id,age from test limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
type: index
possible_keys: NULL
key: age
key_len: 16
ref: NULL
rows: 12
Extra: Using index
1 row in set (0.00 sec)
可以看出,第一個查詢語句是沒有使用到任何的索引的,而第二個查詢則是使用了age
作為索引。
最後
可以看出,mysql在不給定order by條件的時候,得到的資料結果的順序是跟查詢列有關的。因為在不同的查詢列的時候,可能會使用到不同的索引條件。Mysql在使用不同索引的時候,得到的資料順序是不一樣的。這個可能就跟Mysql的索引建立機制,以及索引的使用有關了。更深的東西,在這裡就不深追了。為了避免這種情況,在以後的專案中,切記要加上order by