MySQL默认排序真的是按主键来排序的吗
  前两天在⼯作中遇到⼀个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;
+----+------+mysql 要钱吗
| 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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。