我们知道索引排序分为两种Using Index,Using filesort如图:
一般来说:当Where 条件和 order by 子句作用在不同的列上,建立联合索引可以避免Using filesort的产生。
但是,我们在索引优化排序时可能会遇到这种情况:
排序的字段不在where的条件中。没有办法走索引排序Using Index而是走的文件排序Using filesort ,这个时候该怎么办?
这个时候就需要看文件排序用的是单路排序还是双路排序(回表排序)
示例验证下各种排序方式: 查看下这条sql对应trace结果如下(只展示排序部分):
set session optimizer_trace="enabled=on",end_markers_in_json=on; ‐‐开启trace
select * from employees where name = 'zhuge' order by position; select * from information_schema.OPTIMIZER_TRACE;
trace排序部分结果:
"join_execution": {
‐‐Sql执行阶段
"select#": 1,
"steps": [
{
"filesort_information": [
{
"direction": "asc",
"table": "`employees`",