MySQL 預設排序真的是按主鍵來排序的嗎

舊夢發癲發表於2018-09-03

  前兩天在工作中遇到一個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

相關文章