order by使用索引列排序时会失效吗?

在SQL查询中,orderby语句的效率取决于驱动表的选择和索引的有效利用。驱动表是在多表联查时首先被查询的表,其选择应尽可能减少数据量。如果orderby依据的是驱动表的索引列,则索引能有效提高排序效率;反之,如果排序字段来自非驱动表,索引将不起作用,可能导致性能下降。因此,理解并优化驱动表选择对于提升SQL查询性能至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

order by使用索引列排序时会失效吗?
在使用order by对某列进行排序时, 其sql一定进行了多表联查的操作. 说白了肯定做了表关联. 既然有表关联, 那order by排序就可以对任意的表进行排序. 那么应该对那个表进行排序好点呢?

先说结论, order by后面跟的索引列只是对 驱动表才起作用, 也就是说如果是对驱动表进行排序, 那么order by后面的索引是起作用的, 但是如果order by后面跟的排序字段不是驱动表的, 那么这时索引是不起作用的.

问题来了 , 什么是驱动表?
在进行多表联查时, sql执行时会先查出一个表中符合查询条件的数据,然后再用这些条件去匹配另一个表中的符合条件的数据 , 合并后的数据就是我们要的结果集. 那么先查出来结果集的这个表就是驱动表.

问题又来了, 谁有资格做驱动表?
答: 谁查出来符合条件的数据量少, 谁就最有资格做驱动表. 这里为什么只说最有资格做? 而不是一定做?
因为当用户使用 left join , right join 指定了驱动表时, 以用户指定的表作为驱动表. (关键字左边的表时驱动表) , 当用户使用join 或者 , 没有指定驱动表时, 由数据库自己挑出一个结果集最少的表作为驱动表. 如果用户使用left join指定了一个查询出来数据量很大的表作为驱动表时, 那就很糟糕了.

order by索引排序的失效与不失效?
如果order by 后的排序字段用的是驱动表的排序字段, 那么这个字段的索引是不失效的, 效率高.
如果order by 后的排序字段用的不是驱动表的字段 , 那么索引不会起作用, 数据库会将驱动表查出来的数据和其他表进行关联, 关联后的结果集创建一个临时表进行存储, 然后对这个临时表按非驱动表的列进行排序 ,这样sql效率会变慢.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值