explain mysql using filesort:_Mysql之EXPLAIN显示using filesort
索引使用经验:
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相关推荐
- explain mysql怎么用_mysql中explain用法详解
EXPLAIN用于SELECT语句中的每个表返回一行信息.表以它们在处理查询过程中将被MySQL读入的顺序被列出 如果在select语句前放上关键词explain,mysql将解释它如何处理selec ...
- mysql 优化关键字_Mysql之Explain关键字及常见的优化手段
Explain关键字字段描述: Explain关键字字段详情描述 id 我们写的查询语句一般都以SELECT关键字开头,比较简单的查询语句里只有一个SELECT关键字,但是下边两种情况下在一条查询语句 ...
- mysql中explain的使用,mysql使用方法_mysql中explain函数的使用方法
摘要 腾兴网为您分享:mysql中explain函数的使用方法,英语字典,小熊到家,腾讯新闻,刷机大师等软件知识,以及adobeflashplayerformac,灯光工厂,全民小视频,网盘解析,37 ...
- mysql 优化命令_MySQL优化Explain命令简介(一)
最近碰到MySQL需要写入大量数据并查询的场景,于是学习了一下MySQL的查询优化,想找关于explain命令的详细资料,然而网上并没有找全,最后终于在<高性能MySQL>中找到了对这一命 ...
- mysql explain key为空_MySQL中explain的使用以及性能分析
原标题:MySQL中explain的使用以及性能分析 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性 ...
- mysql range用法_MySQL中Explain的用法总结(详细)
本篇文章给大家带来的内容是关于MySQL中Explain的用法总结(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 执行计划(query Execution plan) 语法e ...
- mysql 注释 乱码_mysql中注释显示中文乱码怎么解决
2016-12-10 回答 linux下mysql插入中文显示乱码解决方案 mysql -uroot -p 回车输入密码 进入mysql查看状态如下: mysql不能插入中文 默认的是客户端和服务器都 ...
- mysql 查询任务_mysql中怎样显示服务器正在执行的sql任务
查询Oracle正在执行32313133353236313431303231363533e58685e5aeb931333365636636的sql语句及执行该语句的用户 SELECT b.sid o ...
- mysql 执行效率命令_MySQL优化--explain 分析sql语句执行效率
MySQL优化--explain 分析sql语句执行效率 explain 命令 explain 命令在解决数据库性能上市第一推荐使用命令,大部分的性能问题可以通过此命令来简单解决,explain可以用 ...
最新文章
- wegame饥荒一直连接中_怪诞画风下的异世界生存,一款让你吃到撑的游戏——《饥荒》...
- 你不知道的Python的输入输出
- 【每日一题】4月8日题目精讲 黑白树
- linux如何调试脚本文件目录,如何在Linux下调试Bash Shell脚本的方法
- 为你的网站加上SSL,可以使用HTTPS进行访问
- 解决Centos 7安装在虚拟机中没有图形界面的问题
- 关于“抵制”易语言的通告
- N卡A卡流处理器的区别解析
- 数据库系统工程师(软考)
- 基于websocket单台机器支持百万连接分布式聊天(IM)系统
- 使用正则表达式写网易通行证
- redis 客户端操作命令
- 【wps】wps怎样删除中间的一页?
- 大多数计算机专业研究生的三年是怎么过的?
- 开篇-开启全新的.NET现代应用开发体验
- 谈谈人工智能的罪与罚
- 判断三维空间两线段是否相交(附代码)
- 2008 IT图书大盘点
- 珍惜那些在背后默默为你付出的人
- linux设置NLS_LANG
热门文章
- matlab RBF神经网络对iris鸢尾花数据集进行分类
- win10关闭实时防护的步骤教程
- ubuntu16.04下安装网易云音乐(官网已经换为18.04)
- tableau ODBC驱动下载方法和链接(连接mysql的驱动)
- 激光振镜协议C语言源码,Laser-Marking 激光振镜打标机源代码 - 下载 - 搜珍网
- 03SpringMVC的使用
- 小程序开发API之监听加速计wx.startAccelerometer
- IPv4下,划分子网,构造超网(CIDR)
- 选择数据中心的位置,需要从这五大方面考虑
- Linux 入门基本操作