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

时间:2025-02-17 21:03:16

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效率会变慢.