当前位置: 首页 > news >正文

【MySQL】官网学习 order by 优化

目录

    • 前言
    • 利用联合索引
    • 关注where 条件命中索引
    • 非必要情况,不要 asc desc 混用
    • 文件排序 filesort
      • 促进 filesort 的全局配置

前言

order by 优化的方向:

  1. 尽可能让查询优化器选择走索引就能完成。
  2. 如果不能通过索引能完成排序,则会使用到文件排序(filesort) ,如果文件大小合适,可以进行内存级别的filesort。
  3. 数据量大到一定级别,内存级别的 filesort 不够用,需要磁盘配合进行内存交换,这种排序的速度也是很慢的,可以重点优化。
  4. 最差的情况下是连文件排序(filesort)都不使用,是优化的重点对象。

官网 :order by 优化


利用联合索引

SELECT * FROM t1
  ORDER BY key_part1, key_part2;
  • 以上语句的索引失效隐患
    select * 表示除了全表扫描,会存在回表的现象,回表次数多了,效率会降低。当查询优化器觉得多次回表还不如全表扫描的时候,则会让查询走全表扫描。联合索引的优势就被浪费掉了
SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;
  • 尽可能使用
SELECT  key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;

以上两个语句都可以利用联合索引,(id也是联合索引的一部分,也可以避免回表)

并不是说 select *一定会使索引失效,下文将讲使用select * 的情况下尽量让排序走索引


关注where 条件命中索引

  • 等值命中联合索引的一部分
SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2;
  • 范围命中
SELECT * FROM t1
  WHERE key_part1 > constant
  ORDER BY key_part1 

SELECT * FROM t1
  WHERE key_part1 = constant1 AND key_part2 > constant2
  ORDER BY key_part2;

范围命中,由查询优化器觉得范围查询 + 部分联合索引的效率是否高于全表扫描。增大了走索引的可能性

  • 使用不同索引进行排序,对查询只有少部分增益
    区别与联合索引 (key_part1 , key part2),如果建立key1 和 key2 两个独立列的索引。由于两个索引在不同的b+树上,以下的排序不能用 b+ 树完成,但是可以用b+ 树完成部分数据的筛选,从而进行filesort。
    SELECT * FROM t1 ORDER BY key1, key2;
    

非必要情况,不要 asc desc 混用

In some cases, MySQL cannot use indexes to resolve the ORDER BY, although it may still use indexes to find the rows that match the WHERE clause. Examples:

  • The query mixes ASC and DESC:
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

官方提醒我们不要混用 asc 和 desc

  • 值得注意的是 order by last_update_time , name desc 会被翻译成 order by last_update_time asc, name desc , 这是个潜在的混用场景。

文件排序 filesort

  • 官方鼓励我们让order by 走索引,如果没法走,也争取走 filesort。换言之,可以把Using temporary 优化成 Using filesort
    • Using temporary 的情况列举为:
      在这里插入图片描述

促进 filesort 的全局配置

  • max_length_for_sort_data
    这个配置的意思是,超过这个length,mysql就乐于用内存/磁盘 参与到排序中。
    减少这个值的副作用是,可能会增大整个mysql的内存活动率

  • sort_buffer_size
    调大这个值,可以减少内存交换的开销,让足够多的数据都往内存放。

    网上查到的说法是 filesort 用的是快排,这个参数调大,间接让 partition 每次merge都有较宽裕的空间

  • read_rnd_buffer_size
    调大这个值,单次读入内存的行数会增多,间接加速 filesort

相关文章:

  • 二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码
  • 【解包裹】基于最小二乘法实现解包裹附matlab代码
  • vim如何进行批量化注释及取消,也在1024表明自己算十分之一的程序员
  • 1024程序员节|【MySQL从入门到精通】【高级篇】(二十七)外连接和内连接如何进行查询优化呢?join的原理了解一波
  • 57.(前端)删除用户操作
  • 手动搭建K8S环境
  • ESP32-C3入门教程 网络篇⑦——基于esp_http_client实现HTTP的POST/GET/PUT/DELETE请求服务器的第三种方法
  • linux Shell入门
  • div与表格应用实例——计算器布局
  • 爬虫的三大库
  • 基于Java+Springboot+Vue+elememt社区疫情防控系统设计和实现
  • 【Linux】yum 与 vim 的基本使用
  • SpringCloudAlibaba【六】微服务架构下的秒杀案例
  • 字节一面:TCP 三次握手,问的好细!
  • 一个功能齐全的,多用途管理后台模板
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Docker: 容器互访的三种方式
  • ES6--对象的扩展
  • Fastjson的基本使用方法大全
  • Hexo+码云+git快速搭建免费的静态Blog
  • IOS评论框不贴底(ios12新bug)
  • iOS小技巧之UIImagePickerController实现头像选择
  • js继承的实现方法
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • MySQL-事务管理(基础)
  • php中curl和soap方式请求服务超时问题
  • Python_OOP
  • Python十分钟制作属于你自己的个性logo
  • Selenium实战教程系列(二)---元素定位
  • Spring声明式事务管理之一:五大属性分析
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 关于使用markdown的方法(引自CSDN教程)
  • 猴子数据域名防封接口降低小说被封的风险
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 利用DataURL技术在网页上显示图片
  • 漂亮刷新控件-iOS
  • 删除表内多余的重复数据
  • 网络应用优化——时延与带宽
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #Linux(Source Insight安装及工程建立)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (十二)springboot实战——SSE服务推送事件案例实现
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .Net 8.0 新的变化
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET委托:一个关于C#的睡前故事
  • @SentinelResource详解
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [] 与 [[]], -gt 与 > 的比较