摘要:前两天在工作中遇到一个排序的问题,在没有加的时候,获取的数据顺序是随机的而不是按照主键排序的。以往我都以往的排序默认是按主键来排序的。在使用不同索引的时候,得到的数据顺序是不一样的。
前两天在工作中遇到一个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
摘要:减少数据冗余,避免维护异常,节约存储空间。第二范式数据库的表中不存在非关键字段对任意候选关键字段的部分函数依赖。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关主要针对联合主键而言。 数据库设计 目的 结合DBMS(数据库管理系统)实现有效存储、高效访问。减少数据冗余,避免维护异常,节约存储空间。 大概的步骤 需求分析->逻辑设计->物理设计(考虑数据库系统...
摘要:黑客技术点击右侧关注,了解黑客的世界开发进阶点击右侧关注,掌握进阶之路开发点击右侧关注,探讨技术话题作者丨呼延十排版丨团长前言本文主要受众为开发人员所以不涉及到的服务部署等操作且内容较多大家准备好耐心和瓜子矿泉水前一阵系统的学习了一下也有 ...
摘要:数据库连接池优化数据库连接池本质上是一种缓存,它是一种抗高并发的手段。数据库连接池优化主要是对参数进行优化,一般我们使用连接池,它的具体参数如下初始连接数,这里的初始指的是第一次的时候,而不是应用启动的时候。 0、前言 数据库优化有很多可以讲,按照支撑的数据量来分可以分为两个阶段:单机数据库和分库分表,前者一般可以支撑500W或者10G以内的数据,超过这个值则需要考虑分库分表。另外,一...
摘要:本篇文章将以问答的形式讲述关于自增的一切。关于自增列我们该怎么维护维护方面主要提供以下点建议字段类型选择方面推荐使用无符号类型,若可预测该表数据量将非常大可改用无符号类型。多关注大表的自增值,防止发生主键溢出情况。 导读:在使用MySQL建表时,我们通常会创建一个自增字段(AUTO_INCREMENT),并以此字段作为主键。本篇文章将以问答的形式讲述关于自增id的一切。 注: 本文所讲...
阅读 3054·2021-11-24 09:38
阅读 1994·2021-11-23 09:51
阅读 1557·2021-10-13 09:39
阅读 2336·2021-09-23 11:53
阅读 1211·2021-09-02 15:40
阅读 3470·2019-08-30 15:54
阅读 1000·2019-08-30 13:04
阅读 2403·2019-08-30 11:01