当前位置: 首页 > 知识库问答 >
问题:

mysql添加联合索引之后排序发生变化?

贾飞鸿
2024-11-23

mysql添加联合索引之后排序发生变化。

create table sys_follow(
    id bigint UNSIGNED primary key,
    biz_id BIGINT UNSIGNED not null,
    status TINYINT(4) DEFAULT 0,
    creation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

insert into sys_follow(id,biz_id,status) VALUES(1,21,1)

insert into sys_follow(id,biz_id,status, creation_time) VALUES(2,21,0, '2024-10-21 11:11:11')

select * from sys_follow where biz_id = 21;

image.png

在未创建索引的情况下,是按照id升序排列。

create index idx_biz_id_status on sys_follow(biz_id,status);

select * from sys_follow where biz_id = 21;

在创建完这条索引之后,将会按照 id 降序排列。除非手动指定 order by id asc .

image.png

请问这是什么原因导致的呢?

找不到具体原因。

共有2个答案

柳珂
2024-11-23

创建了联合索引 idx_biz_id_status 后,MySQL 优化器会选择使用这个索引来加速查询。由于索引是按照 biz_id 和 status 排序的,查询结果会受到索引顺序的影响。

翟卓君
2024-11-23

回答

在 MySQL 中,添加索引后查询结果的排序发生变化,这并不是因为索引本身改变了数据的物理存储顺序,而是因为查询优化器选择了不同的执行计划。

解释

  1. 未添加索引时的查询

    • 当没有索引时,MySQL 通常会使用全表扫描来执行查询。
    • 默认情况下,如果没有 ORDER BY 子句,MySQL 不保证查询结果的排序。尽管在某些情况下(如主键顺序插入的数据),结果可能看起来是按某种顺序排列的,但这只是巧合,不应作为依赖。
    • 在你的例子中,由于没有 ORDER BY 子句,结果按 id 升序排列可能只是数据插入顺序的反映。
  2. 添加索引后的查询

    • 添加 idx_biz_id_status 索引后,MySQL 优化器可能会选择使用这个索引来加速查询。
    • 索引 idx_biz_id_status 是按 (biz_id, status) 排序的。因此,使用此索引检索到的数据将按 biz_idstatus 的顺序排列。
    • 由于索引不包含 id 列,MySQL 在使用索引检索到数据后,可能会以任何它认为高效的方式返回结果集。这通常意味着结果集不会按 id 排序,除非明确指定了 ORDER BY 子句。
    • 在你的例子中,结果集看起来按 id 降序排列,这很可能是 MySQL 在处理索引和数据检索时的内部机制导致的。然而,这种排序是不稳定的,可能会因数据变化或查询优化器的决策而改变。

结论

  • 不要依赖未指定 ORDER BY 的查询结果的排序。如果希望结果按特定顺序排列,应始终使用 ORDER BY 子句。
  • 索引用于加速查询,而不是保证排序。索引的创建可能会改变查询优化器的决策,从而影响结果集的返回顺序。

在你的例子中,如果希望结果按 id 升序排列,应添加 ORDER BY id ASC 子句到查询中。

 类似资料:
  • 问题内容: 每个表(表1和表2)都有其自己的DATETIME字段。 我正在尝试捕获两个表的ID,并按其DATETIME字段对其进行排序。 例子: 我的输出未通过以下查询正确排序: 所需数据: 来自表2 id:2、1, 来自表1 id:3、2、1 因此:2、1、3、2、1 ////编辑 对于可能会遇到冗长而复杂的MySQL请求的人们,请在PhpmyAdmin中尝试一下!它会告诉您错误! ////编辑

  • 本文向大家介绍MySQL联合索引用法示例,包括了MySQL联合索引用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了MySQL联合索引。分享给大家供大家参考,具体如下: 员工表 userid 部门表 deptid 员工部门表 条件:一个员工可以对应多个部门 问题:怎么样设置数据库,让其不能重复添加 userid 和deptid? uuid userid deptid 111 212

  • 本文向大家介绍MySQL索引之主键索引,包括了MySQL索引之主键索引的使用技巧和注意事项,需要的朋友参考一下 在MySQL里,主键索引和辅助索引分别是什么意思,有什么区别? 上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们继续介绍主键索引和辅助索引的区别。 1、主键索引 主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没

  • 本文向大家介绍Mysql之组合索引方法详解,包括了Mysql之组合索引方法详解的使用技巧和注意事项,需要的朋友参考一下 对于任何DBMS,索引都是进行优化的最主要的因素。对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降。  如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。例如:  假设存在组合索引(c1,c2),

  • 本文向大家介绍SQL 排序索引,包括了SQL 排序索引的使用技巧和注意事项,需要的朋友参考一下 示例 如果您使用按检索方式排序的索引,则该SELECT语句在检索时不会进行其他排序。 执行查询时 数据库系统不会执行其他排序,因为它可以按该顺序进行索引查找。

  • 主要内容:1 独立的列,2 前缀索引和索引选择性,3 多列(组合、联合)索引,3.1 多个单列索引的问题,3.2 使用多列索引,4 选择适合的索引列顺序,5 聚簇(聚集)索引,6 覆盖索引详细介绍了各种高性能的索引使用策略,比如联合索引、索引顺序、聚簇索引、覆盖索引等等,以及常见索引失效的情况。 前面我们已经介绍了各种类型的索引结构及其对应的优缺点: BTREE索引的数据结构以及具体实现原理深入解析 哈希索引的数据结构以及索引的优缺点 正确的创建和使用索引是实现高性能查询的基础。我们通常会看到一

  • 我正在使用Spring Boot webflow和Spring data reactive mongob。我有一个用@Document注释的用户类,它实现了User细节。问题是我有一个带有@Indux(唯一=true)的字段。当应用程序启动时,即使在数据库上创建索引,它也会抛出下面的错误。 以下是课程: 错误: 谢谢你的帮助。

  • 问题内容: 如果排序列上有索引,排序是否使用mysql索引?索引还用于其他什么用途? 它对列的组合索引和单独索引有什么区别? 问题答案: 是的,当按排序列排序时,MySQL使用索引对信息进行排序。 另外,如果在添加到 SELECT 子句的所有列中都有索引,则MySQL不会从表本身加载数据,而是从索引加载数据(更快)。 合并和单独的索引之间的区别是,MySQL不能使用超过 一个 每次查询索引,因此,