MySQL 默認排序真的是按主鍵來排序的嗎

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

相關文章
相關標籤/搜索