mysql orderby排序

  created  by  yangwcn {{tag}}
创建于 2020年05月17日 22:46:38 最后修改于 2020年05月17日 22:46:38

最优雅的方式

where 字段和orderby字段组成一个联合索引,这个样一个普通业务的order只需要通过这个索引就能确定排序顺序,不需要额外的临时表来计算字段的排序

内部运行的两种方式

可以通过配置max_length_for_sort_data改变mysql判断采取方式。

  1. 全字段排序
    将命中的行的所有要查询的结果集都放到排序的临时表内,排序后将数据结果集返回

  2. 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





评论区
评论
{{comment.creator}}
{{comment.createTime}} {{comment.index}}楼
评论

mysql orderby排序

mysql orderby排序

最优雅的方式

where 字段和orderby字段组成一个联合索引,这个样一个普通业务的order只需要通过这个索引就能确定排序顺序,不需要额外的临时表来计算字段的排序

内部运行的两种方式

可以通过配置max_length_for_sort_data改变mysql判断采取方式。

  1. 全字段排序
    将命中的行的所有要查询的结果集都放到排序的临时表内,排序后将数据结果集返回

  2. 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






mysql orderby排序2020-05-17yangwcn

{{commentTitle}}

评论   ctrl+Enter 发送评论