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