最优雅的方式
where 字段和orderby字段组成一个联合索引,这个样一个普通业务的order只需要通过这个索引就能确定排序顺序,不需要额外的临时表来计算字段的排序
内部运行的两种方式
可以通过配置max_length_for_sort_data改变mysql判断采取方式。
全字段排序
将命中的行的所有要查询的结果集都放到排序的临时表内,排序后将数据结果集返回rowid 排序
将命中的行的排序字段和主键id放到临时表内排序,再根据排序后的主键id进行一次回表查询
其他的点
虽然有联合索引,但是当where的条件不止一个时候,order by就会失效,可以采取多次查询结果,然后在服务中排序的方式来解决问题
判断临时表的使用情况
/* 打开 optimizer_trace,只对本线程有效 */ SET optimizer_trace='enabled=on'; /* @a 保存 Innodb_rows_read 的初始值 */ select VARIABLE_VALUE into @a from performance_schema.session_status where variable_nam /* 执行语句 */ select city, name,age from t where city='杭州' order by name limit 1000; /* 查看 OPTIMIZER_TRACE 输出 */ SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G /* @b 保存 Innodb_rows_read 的当前值 */ select VARIABLE_VALUE into @b from performance_schema.session_status where variable_name /* 计算 Innodb_rows_read 差值 */ select @b-@a