索引使用经验:

1. 一条 SQL 语句只能使用 1 个索引 (5.0-),MySQL 根据表的状态,选择一个它认为最好的索引用于优化查询

2. 联合索引,只能按从左到右的顺序依次使用

Using where; Using filesort

当EXPLAIN中的extra中出现Useing filesort时说明语句性能不好,需要优化。

Using filesort 是一种速度很慢的外部排序。

即使order by 后的字段加了索引,也可能出现Using filesort,因为有可能索引定义不当,MySQL 没有用到索引

例如:

explain SELECT * FROM table_item WHERE user_id = 2 ORDER BY item_id LIMIT 0, 5

user_id 和 item_id 是 2 个索引,MySQL执行这条语句时候 选择了 user_id,那么 item_id 的索引没有起到任何用处,所以,当我要排序的时候,由于记录数较多,内存中的排序 buffer 满了,只能 Using filesort 进行外部排序,因此每次查询要从磁盘读取几十 M 的数据,太慢了。

修改表结构,删除 user_id 和 item_id 的 INDEX 索引,建立一个名为 user_item 的联合 UNIQUE 索引,顺序是先 user_id 后 item_id,再 EXPLAIN,这回只有 Using where 了。

再刷新页面,观察任务管理器,mysqld-nt.exe 只读取了 2K 的数据,页面咔的一下就出来了…

只有在order by 数据列的时候才可能会出现using filesort,而且如果你不对进行order by的这一列设置索引的话,无论列值是否有相同的都会出现using filesort。因此,只要用到order by 的这一列都应该为其建立一个索引。

例如:

SELECT * FROM DB.TB WHERE ID=2222 AND FID IN (9,8,3,13,38,40) ORDER BY INVERSE_DATE LIMIT 0, 5

里面建立的索引为一个三列的多列索引:IDX(ID,FID ,INVERSE_DATE) 。INVERSE_DATE这个是时间的反向索引。

对于这个sql我当时最开始认为应该是个优化好的状态,应该没有什么纰漏了,结果一explain才发现竟然出现了:Using where; Using filesort。

为什么呢,后来经过分析才得知,原来在多列索引在建立的时候是以B-树结构建立的,因此建立索引的时候是先建立ID的按顺序排的索引,在相同ID的情况下建立FID按 顺序排的索引,最后在FID 相同的情况下建立按INVERSE_DATE顺序排的索引,如果列数更多以此类推。有了这个理论依据我们可以看出在这个sql使用这个IDX索引的时候只是用在了order by之前,order by INVERSE_DATE 实际上是using filesort出来的。。汗死了。。因此如果我们要在优化一下这个sql就应该为它建立另一个索引IDX(ID,INVERSE_DATE),这样就消除了using filesort速度也会快很多。问题终于解决了。

explain mysql using filesort:_Mysql之EXPLAIN显示using filesort相关推荐

  1. explain mysql怎么用_mysql中explain用法详解

    EXPLAIN用于SELECT语句中的每个表返回一行信息.表以它们在处理查询过程中将被MySQL读入的顺序被列出 如果在select语句前放上关键词explain,mysql将解释它如何处理selec ...

  2. mysql 优化关键字_Mysql之Explain关键字及常见的优化手段

    Explain关键字字段描述: Explain关键字字段详情描述 id 我们写的查询语句一般都以SELECT关键字开头,比较简单的查询语句里只有一个SELECT关键字,但是下边两种情况下在一条查询语句 ...

  3. mysql中explain的使用,mysql使用方法_mysql中explain函数的使用方法

    摘要 腾兴网为您分享:mysql中explain函数的使用方法,英语字典,小熊到家,腾讯新闻,刷机大师等软件知识,以及adobeflashplayerformac,灯光工厂,全民小视频,网盘解析,37 ...

  4. mysql 优化命令_MySQL优化Explain命令简介(一)

    最近碰到MySQL需要写入大量数据并查询的场景,于是学习了一下MySQL的查询优化,想找关于explain命令的详细资料,然而网上并没有找全,最后终于在<高性能MySQL>中找到了对这一命 ...

  5. mysql explain key为空_MySQL中explain的使用以及性能分析

    原标题:MySQL中explain的使用以及性能分析 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性 ...

  6. mysql range用法_MySQL中Explain的用法总结(详细)

    本篇文章给大家带来的内容是关于MySQL中Explain的用法总结(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 执行计划(query Execution plan) 语法e ...

  7. mysql 注释 乱码_mysql中注释显示中文乱码怎么解决

    2016-12-10 回答 linux下mysql插入中文显示乱码解决方案 mysql -uroot -p 回车输入密码 进入mysql查看状态如下: mysql不能插入中文 默认的是客户端和服务器都 ...

  8. mysql 查询任务_mysql中怎样显示服务器正在执行的sql任务

    查询Oracle正在执行32313133353236313431303231363533e58685e5aeb931333365636636的sql语句及执行该语句的用户 SELECT b.sid o ...

  9. mysql 执行效率命令_MySQL优化--explain 分析sql语句执行效率

    MySQL优化--explain 分析sql语句执行效率 explain 命令 explain 命令在解决数据库性能上市第一推荐使用命令,大部分的性能问题可以通过此命令来简单解决,explain可以用 ...

最新文章

  1. wegame饥荒一直连接中_怪诞画风下的异世界生存,一款让你吃到撑的游戏——《饥荒》...
  2. 你不知道的Python的输入输出
  3. 【每日一题】4月8日题目精讲 黑白树
  4. linux如何调试脚本文件目录,如何在Linux下调试Bash Shell脚本的方法
  5. 为你的网站加上SSL,可以使用HTTPS进行访问
  6. 解决Centos 7安装在虚拟机中没有图形界面的问题
  7. 关于“抵制”易语言的通告
  8. N卡A卡流处理器的区别解析
  9. 数据库系统工程师(软考)
  10. 基于websocket单台机器支持百万连接分布式聊天(IM)系统
  11. 使用正则表达式写网易通行证
  12. redis 客户端操作命令
  13. 【wps】wps怎样删除中间的一页?
  14. 大多数计算机专业研究生的三年是怎么过的?
  15. 开篇-开启全新的.NET现代应用开发体验
  16. 谈谈人工智能的罪与罚
  17. 判断三维空间两线段是否相交(附代码)
  18. 2008 IT图书大盘点
  19. 珍惜那些在背后默默为你付出的人
  20. linux设置NLS_LANG

热门文章

  1. matlab RBF神经网络对iris鸢尾花数据集进行分类
  2. win10关闭实时防护的步骤教程
  3. ubuntu16.04下安装网易云音乐(官网已经换为18.04)
  4. tableau ODBC驱动下载方法和链接(连接mysql的驱动)
  5. 激光振镜协议C语言源码,Laser-Marking 激光振镜打标机源代码 - 下载 - 搜珍网
  6. 03SpringMVC的使用
  7. 小程序开发API之监听加速计wx.startAccelerometer
  8. IPv4下,划分子网,构造超网(CIDR)
  9. 选择数据中心的位置,需要从这五大方面考虑
  10. Linux 入门基本操作