今天上班发现线上机器CPU告警,看了一下发现是mysqld一直占用CPU处于满负荷状态,show processlist;一下,发现很多查询在排序状态,随便拿了一条sql explain看了一下,如下图:
    
注意到后面多了一个Using filesort; 这个的意思并不是说要在磁盘上进行排序。因为mysql的排序方法主要分为两大类,一种是排序的字段是有索引的,因为索引是有序的,所以不需要另外排序,另一种是排序的字段没有索引,所以需要对结果进行排序,在这种情况下才会如上图所示显示一个Using filesort表示这个查询需要排序。而这里奇怪的是,这个查询的排序字段applydate是有索引的,而且看possible_keys这一栏也可以看到这个索引在检索的时候是可能用到的key。
   Show index 确认是否有索引:
 
        问题查到这里开始有点不知所措了,内存问题也被排除了。然后考虑是否是max_length_for_sort_data, sort_buffer_size这个参数设置过小造成的,实际上后来想想这个因素是可以直接排除的,因为如果索引可以用的话是不需要另外排序的。开始怀疑是否是索引不可用的问题了。于是冒险把索引重建了试试。一开始尝试能不能用repair命令来修复索引,发现这个命令只适用于myisam引擎,于是只好删除索引重建。160W+行,删除一个索引耗时14min, 创建索引耗时19min,当然这个耗时不是绝对的,还要考虑机器CPU性能、负荷情况、以及各参数设置等。
        在删除掉了索引还没创建之前,我特地测试了一下同一条查询在有老的索引和当前没有这个关键索引的情况下的查询时间,删除索引前耗时13s,删除索引后耗时19s,可以说是在同一个量级了,到这里似乎更能确定索引其实是不可用的。
        等待19min后,重建索引成功,迫不及待的试着执行了同一条sql,耗时0.22s。瞬间那个激动的心情溢于言表。再次explain这条查询,Using filesort也没有了。至此问题算是解决了。但是疑惑还是有很多,主要有以下几点:
        1.是什么导致了索引不可用
         2.如何确定执行执行这条查询的时候实际上是否用到了索引(explain的参数都是预估的),能否实时看到sql执行的情况。
      对于第一个问题,看来还需要大量的学习,虽然知道索引是B+树实现的,自己也能手写一个B树出来,但是mysql究竟是如何通过这个B树来加快查询还是不太明白。对于第二个问题,打算研究一下mysql内核,看看能否找到问题的答案。 

mysql Using filesort 索引不可用问题的更多相关文章

  1. MySQL性能优化---索引

    一.什么是索引 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里 ...

  2. MySQL的InnoDB索引原理详解

    摘要 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本篇 ...

  3. MySQL的InnoDB索引原理详解 (转)

    摘要: 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本 ...

  4. 分享MYSQL中的各种高可用技术(源自姜承尧大牛)

    分享MYSQL中的各种高可用技术(源自姜承尧大牛) 图片和资料来源于MYSQL大牛姜承尧老师(MYSQL技术内幕作者) 姜承尧: 网易杭州研究院 技术经理 主导INNOSQL的开发 mysql高可用各 ...

  5. Mysql数据库的索引原理

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...

  6. mysql优化之索引优化

    Posted by Money Talks on 2012/02/23 | 第一篇 序章第二篇 连接优化第三篇 索引优化第四篇 查询优化第五篇 到实战中去 索引优化 索引优化涉及到几个方面,包括了索引 ...

  7. 数据库 MySQL进阶之索引

    数据库的索引非常重要,基本面试数据库的问题都在索引上,所以这里小编整理出来,一方面为了自己复习,一方面也方便大家. 一,索引前传 在了解数据库索引之前,首先有必要了解一下数据库索引的数据结构基础,那么 ...

  8. MySQL学习13 - 索引

    一.索引的介绍 二 .索引的作用 三.常见的几种索引: 3.1 普通索引 3.2 唯一索引 3.3 主键索引 3.4 组合索引 四.索引名词 五.正确使用索引的情况 什么是最左前缀呢? 六.索引的注意 ...

  9. MySQL如何使用索引

    初始化测试数据 创建一个测试用的表 create table dept(id int primary key auto_increment , deptName varchar(32) not nul ...

随机推荐

  1. 每日PA -2019年1月帖-每天更新

    开篇 "每日PA"有什么亮点?

  2. 通过getResourceAsStream 获得Properties文件属性和属性值

    1.Class.getResourceAsStream(String path) path:不以‘/’开头默认是从此类所在的包下取资源:以'/'开头则是从ClassPath根目录下获取 2.Class ...

  3. CSAPP:第十一章 网络编程

    CSAPP:第十一章 网络编程 11.1 客户端服务器模型11.2 全球IP因特网11.3 套接字接口 11.1 客户端服务器模型   每个网络应用都是基于客户端-服务器模型.采用这个模型,一个应用是 ...

  4. 【Java】+SOFA

    https://www.jianshu.com/p/e3dca8d5e9ee sofa脑图

  5. IdentityServer4实战 - 与API单项目整合

    一.前言 我们在实际使用 IdentityServer4 的时候,可能会在使用 IdentityServer4 项目添加一些API,比如 找回密码.用户注册.修改用户资料等,这些API与Identit ...

  6. Elastic Stack-Elasticsearch使用介绍(二)

    一.前言     写博客,更要努力写博客! 二.Mapping介绍 Mapping类似于数据库中的表结构的定义:这里我们试想一下表结构定义需要那些: 1.字段和字段类型,在Elasticsearch中 ...

  7. BAT面试题:使用数组实现一个简单的阻塞队列

    这道题是我亲身经历的一道大厂面试题,非常值得分享! 这道题可以分为两个步骤进行编码解答,第一步是基于数组实现一个队列,第二步是实现线程阻塞. 如果是基于数组实现栈的数据结构,那么我们只需要一个指针进行 ...

  8. Charles(V3.10.1)的抓包以及常见功能的使用

    一.Charles的安装 安装都不会,那就不用再往下看了.(*^__^*) 嘻嘻…… 二.HTTP抓包 1.查看电脑IP地址 2.设置手机的HTTP代理 手机连接到同一WiFi下设置HTTP代理: 服 ...

  9. Windows elasticsearch1.5.1安装

    http.cors.enabled: true http.cors.allow-origin: /.*/ network.host: 192.168.2.200 http.port: cluster. ...

  10. [USACO19FEB]Mowing Mischief

    题目大意: 给定平面上的一些点,求这些点的一个\(LIS\),并且还需要满足下列式子最小: \[ \sum_{i=1}^{n-1}(a[i+1].x-a[i].x)*(a[i+1].y-a[i].y) ...