前兩天在工做中遇到一個Mysql排序的問題,在沒有加order by的時候,獲取的數據順序是隨機的,而不是按照主鍵排序的。以往我都以往mysql的排序默認是按主鍵來排序的。這才發現其實不是這樣的。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
建立一個測試數據庫sql
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
獲得的查詢結果並不同。這個時候咱們來分析下查詢語句code
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
索引