今天上班发现线上机器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. javaEmail发邮件是问号乱码,已解决

    寒假学习了ssm,就把之前看过的一个商城项目用ssm重构了. 然后在本地一切都正常,放到个人服务器上就凉了. 因为这个项目注册需要邮箱激活,然后就在发邮件的时候出了问题. 一.发送端口 因为源程序是用 ...

  2. cordova插件汇总

    1.获取当前应用的版本号 cordova plugin add cordova-plugin-app-version 2.获取网络连接信息 cordova plugin add cordova-plu ...

  3. HashMap、Hashtable、ConcurrentHashMap的原理与区别

    同步首发:http://www.yuanrengu.com/index.php/2017-01-17.html 如果你去面试,面试官不问你这个问题,你来找我^_^ 下面直接来干货,先说这三个Map的区 ...

  4. 微信h5支付

    分为 微信内H5调起支付 和 非微信浏览器H5支付. 1.H5支付(微信内) 参考链接:https://www.jianshu.com/p/6b9acdd10de6 2.JSAPI支付(非微信) 参考 ...

  5. flutter 返回键监听

    本篇为继上片监听返回键基础下优化: 以下做返回键监听两种情况: import 'package:fluttertoast/fluttertoast.dart'; //提示第三方插件 1. 单击提示双击 ...

  6. mysql索引原理

    1.B+Tree 索引的数据结果是B+Tree,它比BTree查询时,以更少的IO次数占优势. 2.聚集索引与非聚集索引 聚集索引:索引的逻辑顺序与磁盘上数据的物理顺序相同.(表中最多只有一个) 比如 ...

  7. MAC 的ideal 修改 项目名称

    在使用 ideal的时候 ,我拷贝了一个文件,想要修改项目的名称,改了qcs-regulation-hefei 但是 (1)我改了项目名称: (2)还改了 pom.xml 但是还是不行,来回切换不同的 ...

  8. codeforces476D

    Dreamoon and Sets CodeForces - 476D Dreamoon likes to play with sets, integers and .  is defined as ...

  9. docker容器的安装与使用

    docker 容器概念 1.什么是容器 容器就是在隔离环境运行的一个进程,如果进程停止,容器就会销毁.隔离的环境拥有自己的系统文件,IP地址,主机名等. kvm虚拟机,linux,系统文件 程序: 代 ...

  10. P1462 通往奥格瑞玛的道路 (二分+最短路)

    题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...