• mysql什么时候会发生file sort


          看了网上很多排名很靠前的博客,发现好多都讲错了!我开始按照博客来,没有怀疑,直到自己试了一下才发现是错的。file sort在面试中有时候会问到,这个其实挺能区分是不是真的了解order by的执行了。大部分人会以为file sort是文件排序,其实不要看字面意思,并不是文件排序!只不过是表示取出来的数据根据order by字段,是否还需要再排序。其实不自己试验,挺难想到的。我这里使用mysql5.7试验了几种情况,供大家参考。首先创建的表字段是 id, username, password, age, gender,其中id是自增的主键索引,(username, password, age)是联合索引。

    1. 第一种情况:查询语句不带where条件过滤

    1)select * from user_info order by username; 使用了file sort,查询的字段不在username联合索引中或者也不是主键id。会产生file sort。等价于 select gender from user_info order by username,也会产生file sort!那 select id from user_info order by username,会不会产生file sort呢?是不会的,因为mysql的b+树叶子节点也是存储了主键信息的。

          

    2)那这样呢 select password from user_info order by username; 这个是不会产生file sort的!因为查询的字段在联合索引中。

          

    3)select username from user_info order by password, username;  这个select的字段username是在联合索引中,但是在索引上查出的数据是先按照username,再按照password排序的。不满足这里的password,username。

       

    2. 第二种情况:查询条件带有where条件过滤

    其实带where条件也主要是看是否用到索引,如果用到索引,看取出来的数据是否符合order by需要的排序顺序。

    1)select * from user_info where username = '1' order by username; 这个where条件是username,等值查询。再去order by username。没必要,所以mysql会把order by 去掉。order by都去掉了,肯定不会file sort了。

      

    2)select age from user_info where age = '1' order by username; 这个是不会的,因为直接使用联合索引去查询 age = 1 的数据,取出来的所有数据自然是根据username排序的(索引排好了序)。不需要file sort。

         

    3) select gender from user_info where age = 1 order by username; 因为gender字段不在order by使用的字段中,mysql没有使用索引去查询,所以需要file sort。

         

    4)select password from user_info where password = '10' order by username, age; 首先看select出来的字段在不在order by所使用的索引中,这个是在的。所以排除第一种情况(不走索引)。继续分析。mysql先去这个索引中找出password 为 '10'的数据行,极大情况有多条,在索引上取出的数据,看是不是符合先按username排序,再按age排序呢?是的,因为从索引上遍历取password='10'的数据时候,取出来的数据天然是按username先排序的(联合索引特性),password是等值的情况下,再按age排序的。所以取出来的数据已经排序了。

        

    这一块一定要注意啊!!!网上很多说mysql使用file sort看order by字段有没有符合最左匹配,是错的!主要是看mysql在where条件上是否使用索引(select (索引中的字段)where 索引中的字段),使用了索引的字段,会using index去查出数据。然后再看是否取出来的数据是否是按照order by字段排好序的。插曲,slect age from user_info where age = 1;会使用索引吗?答案是会的,这个不符合最左前缀匹配,但是select出来的字段是在索引中的。

    5)select password from user_info where age = 1 order by password, username; 这个是会用到索引的,因为select password的字段在索引列中,并且where条件也是age也是在这个索引中的。但是在B+树索引上,根据age取出来的数据,看看是不是先password,再username排序呢?显然不是,所以会发生file sort。

       

    总结:什么时候会发生file sort呢?

      首先,看这个是不是走索引,是不是在索引上查找数据。如果没有使用索引,那么会file sort,因为没有在索引上取数据,那么取出来的数据mysql就认为是无序的,需要file sort。如果使用了索引,取出来的数据看是否是满足order by后面的排序字段要求,如果满足,则不需要file sort,如果不满足,则需要file sort。

  • 相关阅读:
    PE文件简介
    hook键盘驱动中的分发函数实现键盘输入数据的拦截
    遍历系统中加载的驱动程序以及通过设备对象指针获取设备对象名称
    如何利用git shell提交代码到github
    驱动开发中的常用操作
    3.1_栈_顺序存储结构(数组形式)
    2.6_链表深入
    2.5_线性表的链式存储结构_双向链表
    2.4_线性表的链式存储结构_单链表具体实现
    2.3_线性表的链式存储结构_单链表
  • 原文地址:https://www.cnblogs.com/zzlback/p/15984573.html
Copyright © 2020-2023  润新知