资讯专栏INFORMATION COLUMN

MySQL 默认排序真的是按主键来排序的吗

?xiaoxiao, / 3019人阅读

摘要:前两天在工作中遇到一个排序的问题,在没有加的时候,获取的数据顺序是随机的而不是按照主键排序的。以往我都以往的排序默认是按主键来排序的。在使用不同索引的时候,得到的数据顺序是不一样的。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/48052.html

相关文章

  • MySQL的优化细节

    摘要:减少数据冗余,避免维护异常,节约存储空间。第二范式数据库的表中不存在非关键字段对任意候选关键字段的部分函数依赖。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关主要针对联合主键而言。 数据库设计 目的 结合DBMS(数据库管理系统)实现有效存储、高效访问。减少数据冗余,避免维护异常,节约存储空间。 大概的步骤 需求分析->逻辑设计->物理设计(考虑数据库系统...

    imccl 评论0 收藏0
  • [灵魂拷问]MySQL面试高频100问(工程师方向)

    摘要:黑客技术点击右侧关注,了解黑客的世界开发进阶点击右侧关注,掌握进阶之路开发点击右侧关注,探讨技术话题作者丨呼延十排版丨团长前言本文主要受众为开发人员所以不涉及到的服务部署等操作且内容较多大家准备好耐心和瓜子矿泉水前一阵系统的学习了一下也有 ...

    gyl_coder 评论0 收藏0
  • 单机数据库优化的一些实践

    摘要:数据库连接池优化数据库连接池本质上是一种缓存,它是一种抗高并发的手段。数据库连接池优化主要是对参数进行优化,一般我们使用连接池,它的具体参数如下初始连接数,这里的初始指的是第一次的时候,而不是应用启动的时候。 0、前言 数据库优化有很多可以讲,按照支撑的数据量来分可以分为两个阶段:单机数据库和分库分表,前者一般可以支撑500W或者10G以内的数据,超过这个值则需要考虑分库分表。另外,一...

    ashe 评论0 收藏0
  • MySQL学习

    摘要:全文索引全文索引是由定义的索引,它只能创建在或类型的字段上,而且,现在只有存储引擎支持全文索引。单列索引单列索引指的是在表中单个字段上创建索引,它可以是普通索引唯一索引或者全文索引,只要保证该索引只对应表中一个字段即可。 $PATH:/usr/local/mysql/bin 创建数据库: CREATE DATABASE 数据库名称 创建一个名称为itcast的数据库 mysql> C...

    Vixb 评论0 收藏0
  • 关于自增id 你可能还不知道

    摘要:本篇文章将以问答的形式讲述关于自增的一切。关于自增列我们该怎么维护维护方面主要提供以下点建议字段类型选择方面推荐使用无符号类型,若可预测该表数据量将非常大可改用无符号类型。多关注大表的自增值,防止发生主键溢出情况。 导读:在使用MySQL建表时,我们通常会创建一个自增字段(AUTO_INCREMENT),并以此字段作为主键。本篇文章将以问答的形式讲述关于自增id的一切。 注: 本文所讲...

    468122151 评论0 收藏0

发表评论

0条评论

?xiaoxiao,

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<