种地 发表于 2024-7-20 15:41:21

mysql 查询语句的默认排序

1. 判定查询条件中的字段有无索引, 假如没有索引, 则查询结果默认按主键的正序排序;
2. 假如查询条件中的字段有索引, 根据索引的不同,  "主键索引" > "唯一索引" > "普通索引". 假如查询字段有多个, 则按照索引最先创建的次序进行正序排序。
3. 在此之外, 针对于多字段的组合索引, 我发现这种索引被命中时, 会按组合索引的字段去排序.  我本日有一个页面逻辑就是触发了这种场景, 根据合同ID查询对应 的付款条件, 发现没有按付款条件的创建次序来排序. 查完资料, 才发现是跟组合索引有关. 这里针对此种情况, 举例:
select * from test_score;   执行结果如下: 
https://img-blog.csdnimg.cn/direct/69933bb1b5f14f04ac61643c3810cfc3.png
select * from test_score where class_no ="A";  执行结果如下: 
https://img-blog.csdnimg.cn/direct/c9d9c38e642e468c8720944abee34960.png
 
通过两个语句的比较, 能看出 class_no字段命中了组合索引 "`idx_test` (`class_no`,`name`) "后,
优先按name字段的值默认排序了, 导致id值不是正序排序的.

后续再拿主键id参与条件查询, 
select * from test_score where id > 0;   执行结果如下: 
https://img-blog.csdnimg.cn/direct/0d7ff33d74004cab856014e3d317f611.png
select * from test_score where id > 0 and class_no ="A" ;  执行结果如下: 
https://img-blog.csdnimg.cn/direct/b203039a45844891b7fbd251a5c4d2cb.png
此种情况下, 照旧优先按组合索引的次序来默认排序的.

指定id为排序条件后,  id值正常排序了
select * from test_score where id > 0 and class_no ="A" order by id asc; 执行结果如下: 
https://img-blog.csdnimg.cn/direct/11fc3b9736994cd28d01755543f52fe4.png

以下是建表语句, 以及测试数据:
CREATE TABLE `test_score` (
`id` int NOT NULL AUTO_INCREMENT,
`grade` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`class_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`name` varchar(30) DEFAULT NULL,
`score` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `idx_test` (`class_no`,`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of test_score
-- ----------------------------
BEGIN;
INSERT INTO `test_score` VALUES (1, '0001', 'A', 'xiaoming', '90');
INSERT INTO `test_score` VALUES (2, '0003', 'B', 'zhangsan', '80');
INSERT INTO `test_score` VALUES (3, '0002', 'A', 'lisi', '100');
INSERT INTO `test_score` VALUES (4, '0002', 'C', 'wangwu', '76');
INSERT INTO `test_score` VALUES (5, '0003', 'B', 'frank', '65');
INSERT INTO `test_score` VALUES (6, '0002', 'A', 'bob', '97');
COMMIT;


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: mysql 查询语句的默认排序