Mysql之EXPLAIN显示using filesort介绍_Mysql

语法格式如下
EXPLAIN tbl_name
或者:
EXPLAIN SELECT select_options
EXPLAIN 语句可以被当作 DESCRIBE 的同义词来用,也可以用来获取一个MySQL要执行的 SELECT 语句的相关信息。

EXPLAIN tbl_name 语法和 DESCRIBE tbl_name 或 SHOW COLUMNS FROM tbl_name 一样。

当在一个 SELECT 语句前使用关键字 EXPLAIN 时,MYSQL会解释了即将如何运行该 SELECT 语句,它显示了表如何连接、连接的顺序等信息。

以下信息为引用:

在explain我们所使用的sql的时候,经常会遇到using filesort这种情况,原以为是由于有相同列值的原因引起,结果昨天看到公司的一个sql,跟同事讨论了下加上自己又做了一些测试,突然发现自己原来的想法是错误的。

首先,只有在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速度也会快很多。问题终于解决了。

时间: 2024-08-18 16:54:17

Mysql之EXPLAIN显示using filesort介绍_Mysql的相关文章

Mysql日志文件和日志类型介绍_Mysql

日志文件类型 MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情: 日志文件 记入文件中的信息类型 错误日志 记录启动.运行或停止mysqld时出现的问题. 查询日志 记录建立的客户端连接和执行的语句. 更新日志 记录更改数据的语句.不赞成使用该日志. 二进制日志 记录所有更改数据的语句.还用于复制. 慢日志 记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询. 默认情况下,所有日志创建于mysqld数据目录中.通过刷新日志,你可以强制 mys

MySQL安全输入密码的一些操作介绍_Mysql

当我们运行mysql客户端连接mysql服务器的时候,以一种暴露的可被其他用户发现的方式指定我们的密码是不妥的.我们输入密码的方式有四种,其中每一种都有一定风险.下面就分别说下这四种方式: MySQL密码输入的安全操作(翻译) 第一种:直接在命令行后使用  -pyour_pass 或者r --password=your_pass 这两种选项. 举例: shell> mysql -u ksharpdabu -pksharppassword db_name 这种方式很方便,但是不安全,因为在某些系统

mysql安全启动脚本mysqld_safe详细介绍_Mysql

在Unix和NetWare中推荐使用mysqld_safe来启动mysqld服务器.mysqld_safe增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息.本节后面列出了NetWare的特定行为. 注释:为了保持同旧版本MySQL的向后兼容性,MySQL二进制分发版仍然包括safe_mysqld作为mysqld_safe的符号链接.但是,你不应再依赖它,因为再将来将删掉它. 默认情况下,mysqld_safe尝试启动可执行mysqld-max(如果存在),否则启动m

MySQL笔记之子查询使用介绍_Mysql

子查询是将一个查询语句嵌套在另一个查询语句中 内层查询语句的查询结果,可以为外层查询语句提供查询条件 因为在特定情况下,一个查询语句的条件需要另一个查询语句来获取 参考表:employee   参考表:department 带IN关键字的子查询 复制代码 代码如下: mysql> SELECT * FROM employee    -> WHERE d_id IN    -> (SELECT d_id FROM department);+------+------+--------+--

mysql 初始执行文件的使用介绍_Mysql

可以在配置文件里指定mysql启动以后初始执行的SQL文件, 其语法是: 在[mysqld]或者[server]下指定: init-file=D:\mysql-5.5.28-winx64\abc.sql, 后边为具体的sql文件值 注意下边两点就行了: 1. 确保你的mysqld 编译的时候没有加 --disable-grant-options 开关. 2. 确保init-file指定的脚本每行是一个具体的可以执行的语句. 为了示例: abc.sql为: 复制代码 代码如下: use test;

mysql之innodb的锁分类介绍_Mysql

一.innodb行锁分类 record lock:记录锁,也就是仅仅锁着单独的一行 gap lock:区间锁,仅仅锁住一个区间(注意这里的区间都是开区间,也就是不包括边界值. next-key lock:record lock+gap lock,所以next-key lock也就半开半闭区间,且是下界开,上界闭. www.jb51.net next-key 锁定范围:(负无穷大,最小第一记录],(记录之间],(最大记录,正无穷大) 二.语句锁定情况分析 SELECT ... FROM ... F

MySQL的事件调度器使用介绍_Mysql

自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务,可以看作基于时间的触发器. 一.开启 事件调度默认是关闭的,开启可执行 复制代码 代码如下: SET GLOBAL event_scheduler=1; SET GLOBAL event_scheduler=ON; 或者在my.ini文件中加上event_scheduler=1 或者在启动命令后加上"-event_scheduler=1" 可以通过如下命令查

mysql之set与enum的介绍_Mysql

set,enum的数据类型都是字符串类型的对象,其中set最多可以包含64个元素,并且可以任意取到集合中的元素.而enum则是只能取到集合中的木一个元素,最多包含65536个元素,也就是说set是多项选择,enum是单项选择了.这里我们来比较下他们之间相同点和不同点: 复制代码 代码如下: mysql> create table db_set(    -> set1 set('x','y','z') not null,    -> enum1 enum('one','two','thre

MySQL多层级结构-树搜索介绍_Mysql

基本上在每个系统中都有那么几张表是自关联父子关系的结构.往往有很多人都是使用pid来做关联.在刚进入IT行业时使用CAKEPHP框架编写WEB的时候,使用它里面的一个ACL plugin实现权限管理的时候.发现一个表结构硬是不明白是怎么回事.具体表结构如下: CREATE TABLE acos ( id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, parent_id INTEGER(10) DEFAULT NULL, model VARCHAR(2