MYSQL order by排序导致效率低小优化

本文探讨了在SQL查询中,如何通过优化索引结构来避免使用filesort操作,从而提高查询效率。具体介绍了在orderby操作中,如何合理地创建和使用索引,以减少排序耗时。

有一个主表left join 同一个小表两次分页语句,因为order by 导致执行时做排序,从执行计划中Using filesort ,以及profile中creating sort index 耗时可以看出。


从trace文件可以看出filesort的计算:


"join_execution": {
        "select#": 1,
        "steps": [
          {
            "filesort_information": [
              {
                "direction": "desc",
                "table": "`topxxx` `t`",
                "field": "create_date"
              }
            ] /* filesort_information */,
            "filesort_priority_queue_optimization": {
              "limit": 20,
              "rows_estimate": 2302749,
              "row_size": 264,
              "memory_available": 4194304,
              "chosen": true
            } /* filesort_priority_queue_optimization */,
            "filesort_execution": [
            ] /* filesort_execution */,
            "filesort_summary": {
              "rows": 21,
              "examined_rows": 216594,
              "number_of_tmp_files": 0,
              "sort_buffer_size": 5712,
              "sort_mode": "<sort_key, rowid>"
            } /* filesort_summary */
          }
        ] /* steps */
      } /* join_execution */
    }



后面通过索引加入排序字段后减去排序操作,排序字段放在索引的最前面。

create index idx_topxxx1 on topic (create_date desc,is_del,is_en);


trace 中可以看出排序使用了索引。


            "reconsidering_access_paths_for_index_ordering": {
              "clause": "ORDER BY",
              "index_order_summary": {
                "table": "`topic` `t`",
                "index_provides_order": true,
                "order_direction": "desc",
                "index": "idx_topxxx1",
                "plan_changed": true,
                "access_type": "index"
              } /* index_order_summary */
            } /* reconsidering_access_paths_for_index_ordering */
          },
          {


以此记录。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29863023/viewspace-2629893/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29863023/viewspace-2629893/

MySQL 中使用 `ORDER BY` 进行排序时,查询速度变慢的原因通常与数据量、索引的使用情况以及执行计划中的排序方式有关。以下是导致性能下降的主要原因及优化方法。 ### 导致查询速度变慢的原因 1. **未使用索引或索引顺序不当** 如果排序字段没有合适的索引,或者组合索引的顺序与 `ORDER BY` 的字段顺序不一致,则无法有效利用索引进行排序导致需要进行文件排序(`Using filesort`)[^2]。 2. **多字段排序增加资源消耗** 当 `ORDER BY` 包含多个字段时,MySQL 需要对多个字段依次进行排序操作,这会显著增加 CPU 和内存的开销,尤其是在大数据集的情况下[^1]。 3. **表连接或子查询中排序效率** 在涉及多表连接或子查询的复杂查询中使用 `ORDER BY`,如果没有正确的索引支持,排序操作可能发生在临时表上,进一步降性能。 4. **字符编码不一致引发隐式转换** 若参与排序的字段来自不同编码的表或字段类型不一致,MySQL 可能需要进行隐式转换,影响排序效率[^2]。 ### 优化方法 1. **创建合适的索引** 对经常用于排序的字段建立索引,尤其是多字段排序时,应创建联合索引,并确保索引顺序与 `ORDER BY` 字段顺序一致。例如: ```sql CREATE INDEX idx_order ON table_name (column1, column2); ``` 2. **避免不必要的排序字段** 精简 `ORDER BY` 中的字段,仅保留必要的排序条件,减少排序复杂度。 3. **使用覆盖索引减少回表操作** 如果查询字段也包含在索引中,则可以避免回表查询,提高效率。例如: ```sql SELECT id, name FROM users ORDER BY create_time DESC; ``` 若 `(create_time, id, name)` 构成联合索引,则可实现覆盖索引优化。 4. **优化执行计划中的 Using filesort** 使用 `EXPLAIN` 分析查询,若发现 `Using filesort`,则应尝试添加索引或调整查询结构以消除该操作。 5. **限制返回结果数量** 对于分页查询,合理使用 `LIMIT` 限制结果集大小,避免对大量数据进行排序。 6. **考虑分区或归档旧数据** 对超大数据表,可考虑按时间或其他维度进行分区,或将历史数据归档到单独的表中,减少排序数据量。 7. **避免在子查询或视图中使用复杂的排序逻辑** 将排序逻辑尽量下推到底层查询,或通过中间临时表缓存排序结果。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值