例如:
explainselectcustomer_idfromcustomerorderbystore_id
第二种是通过对返回数据进行排序,也就是通常说的Filesort排序,所有不是通过索引直接返回排序结果的排序都叫Filesort排序。Filesort并不代表通过磁盘文件进行排序,而只是说明进行了一个排序操作,至于排序操作是否使用了磁盘文件或临时表等,则取决于MySQL服务器对排序参数的设置和需要排序数据的大小。例如,按照商店storeid排序返回所有客户记录时,出现了对全表扫描的结果的排序:explainselect*fromcustomerorderbystore_id;
又如,只需要获取商店store_id和顾客email信息时,对表ustomer的扫描就被对覆盖索引idx_storeid_email扫描替代,此时虽然只访问了索引就足够,但是在索引idx_storeid_email上发生了一次排序操作,所以执行计划中仍然有UsingFilesort。altertablecustomeraddindexidx_storeid_emai1(store_id,email);
explainselectstore_id,email,customer_idfromcustomerorderbyemail;
Filesort是通过相应的排序算法将取得的数据在sort_buffer_size系统变量设置的内存排序区中进行排序,如果内存装载不下,它就会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集。sort_buffer_size设置的排序区是每个线程独占的,所以同一个时刻,MySOL中存在多个sortbuffer排序区。了解了MySOL排序的方式,优化目标就清晰了:尽量减少额外的排序,通过索引直接返回有序数据。WHERE条件和ORDERBY使用相同的索引,并且ORDERBY的顺序和索引顺序相同,并且ORDERBY的字段都是升序或者都是降序。否则肯定需要额外的排序操作,这样就会出现Filesort。