随笔 - 292  文章 - 3 评论 - 0 阅读 - 73043
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

最近发现一个平时经常忽略的问题,就是MySQL查询出来的结果的排序问题。

之前一直认为,如果在sql语句中没有加特定的order by条件,那么查询出来的数据就应该是按照主键(即插入顺序)排序的。但是,今天在项目中拿数据时发现并没有按照“我以为”的方式排序,就研究了下,发现按照什么方式排序与所查询的字段、索引等都有关系的。

因为项目中基本都使用InnoDB引擎,所以就不考虑其他引擎了,自己测试了下:

首先创建测试表(随便写了下sql语句,不要细究什么没有判断表是否存在的问题,哈哈)

小心机一下,字段尽量不要允许为NULL

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT '' NOT NULL,
  `age` int(5) DEFAULT 0 NOT NULL,
  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

插入一些测试数据

复制代码
INSERT INTO test(name, age) VALUES('张三',2);
INSERT INTO test(name, age) VALUES('李四',20);
INSERT INTO test(name, age) VALUES('王五',50);
INSERT INTO test(name, age) VALUES('赵刘',33);
INSERT INTO test(name, age) VALUES('奔驰',19);
INSERT INTO test(name, age) VALUES('宝马',7);
INSERT INTO test(name, age) VALUES('奥迪',21);
INSERT INTO test(name, age) VALUES('雷车',22);
INSERT INTO test(name, age) VALUES('兰博',18);
INSERT INTO test(name, age) VALUES('宾利',99);
INSERT INTO test(name, age) VALUES('夏利',67);
复制代码

测试1:无条件查询前5条记录

SELECT * FROM test LIMIT 5

结果如下

 

 测试2:无条件查询前5条age

select age from test limit 5;

 

 测试3:无条件查询前5条记录,结果集根据age排序

1
select * from test order by age;

 

 分别使用explain命令对这三条sql语句进行分析:

 

 可以看到:

第1、3两条select * 语句的type都是ALL,说明进行的是全表扫描,没有用到索引。(Using filesort情况该如何优化?)

第2条select age 语句的type是index,说明使用的索引进行的扫描;且key是age,说明使用的索引列是age。

总结
如果在sql语句中不指定order by排序条件,那么得到的结果集的排序顺序是与查询列有关的。因为不同的查询列可能会用到不同的索引,从而导致顺序不同。根据上面的情况:查询所有列时是根据id排序的;只查询age列时是根据age列(age列是索引)排序的;而加上order by age后,因为待排序内容不能由所使用的索引直接完成排序,所以要进行文件排序,具体原因就不深究了。

看网上大神的说法是:没有条件的情况下,数据库默认排序顺序是不好确定的,也不应该决定于什么因素,不同的数据库实现不同.只能用order by 来限定。


反正,不要迷信mysql默认会按照你以为的顺序排序,想要排序就先给你想要排序的字段创建索引(提高效率),然后再order by这个字段进行排序。

转载自:https://blog.csdn.net/qq_35383263/article/details/81433693

posted on   Beautytoloveme  阅读(4624)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示