MySQL优化-filesort-Using index condition

五迷三道 提交于 2020-03-18 18:45:32

首先要明白SQL的运行流程,方便理解。

http://blog.itpub.net/22664653/viewspace-1210844/

https://tech.meituan.com/mysql-index.html

阿里大神:

https://yq.aliyun.com/topic/100?spm=5176.8217306.rtdmain.3.vmqTwp

 

ICP 关闭时 ,仅仅使用索引作为访问数据的方式。

ICP 开启时 ,MySQL将在存储引擎层 利用索引过滤数据,减少不必要的回表,注意 虚线的using where 表示如果where条件中含有没有被索引的字段,则还是要经过MySQL Server 层过滤。

#################

sending data   存储引擎搜集数据发送到客户端。

################

filesort

https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html

#################

num1 是辅助索引

num2 是唯一索引

id是主键

desc select id,num1 from a where num1=2 order by id;  ######考点是二级索引的叶子节点包含主键,不需要回表,(num1,id)是逻辑有序的,不会出现filesort。using index

desc select * from a where num1=2 order by id;        #######考点是select * ,会回表,(num1,id)是逻辑有序的,不会出现filesort。using index condition

 desc select * from a where num1 > 2 order by id;     #######考点是num1>2,由于是范围查询,后面的(num1,id),id是逻辑无序的,会出现filesort

desc select num1 from a where num1=2 order by num2;  ######考点是order by num2,  通过num1=2,num2非逻辑有序。会出现filesort

desc select * from a  order by num1;    #####考点不加where的条件,order by 会导致filesort。因为出现全表扫描,没有走索引。

desc select * from a join b on a.id=b.id  where a.num1=2 order by b.num1;  ########考点where后面先查询的a.num1,order by的b表。逻辑上无序,所以a表Using temporary; Using filesor

desc select * from a order by num1 ,num2;  ###全表扫描会出现filesort,复合索引也还是有filesort

desc select * from a where num1=2 order by num1 ,num2;####有复合索引,会使用Using index condition

select * 还是select id 决定了是using index condition还是using index。

一句话的总结:filesort主要是看where后列的条件是否逻辑有序。

杨奇龙总结:

http://blog.itpub.net/22664653/viewspace-2143086/

#################

驱动表的理解:

https://yq.aliyun.com/articles/9048?spm=5176.153233.793261.6.qMiZ2q

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!