mysql查看执行慢的查询,mysql查询慢sql命令
【转】mysql分析寻找执行效率慢的sql语句。启动Mysql时,添加参数-log - log-slow-queries,记录执行时间超过long_query_time秒的sql。
Mysqldumpslow,mysqlslowlog的分析MySQL。
慢速日志是MySQL根据SQL语句的执行时间编写的文件,用于分析执行缓慢的语句。
只要在my.cnf文件中配置了它:
日志慢速查询=[慢速查询日志文件名]
您可以记录超过默认执行时间10s的SQL语句。
如果您想修改默认设置,您可以添加:
long_query_time=5
设置为5s。
解释以了解SQL执行的状态。
解释select * from WP _ posts G;
Explain展示了mysql如何使用索引来处理select语句和连接表。它可以帮助选择更好的索引和编写更优化的查询语句。
使用该方法,只需在select语句前添加explain:
例如,解释select姓氏,名字格式a,b,其中a.id=b.id。
解释栏的解释:
Table:显示该行中的数据是关于哪个表的类型:这是一个重要的列,它显示连接所使用的类型。连接类型从最好到最差依次为const、eq_reg、ref、range、indexhe和ALLpossible_keys:显示可能应用于此表的索引。如果为空,则没有可能的索引。您可以从相关域的WHERE语句中选择一个合适的语句键:实际使用的索引。如果为NULL,则不使用索引。在极少数情况下,MYSQL会选择不够优化的索引。在这种情况下,可以在SELECT语句中使用USE INDEX(indexname)强制使用索引,或者使用IGNORE INDEX(indexname)强制MYSQL忽略索引key_len:所用索引的长度。在不损失准确性的情况下,长度越短越好。ref:显示使用了索引的哪一列。如果可能的话,它是一个常量ROWS:MYSQL认为返回请求的数据必须检查的行数。Extra:关于行的附加信息:MYSQL解析查询。将在表4.3中讨论,但这里可以看到的不好的例子是使用临时和使用文件排序,这意味着MYSQL根本不能使用索引。因此,检索额外列返回的描述的含义会很慢。
Distinct:一旦MYSQL找到与行的并集匹配的行,它就不再搜索Not exists: MYSQL优化左连接,一旦找到与左连接标准匹配的行,它就不再搜索为每个记录检查的范围(索引映射:#):没有找到理想的索引,所以对于前面表中的每个行组合,MYSQL检查使用了哪个索引,并使用它从表中返回行。这是使用索引最慢的连接之一:当您看到这种情况时,查询需要优化。MYSQL需要采取额外的步骤来找出如何对返回的行进行排序。它根据存储排序键值和匹配条件的所有行的连接类型和行指针,使用索引对所有行进行排序:从只使用索引中的信息而不读取实际操作的表中返回列数据。当表中所有被请求的列都属于同一个索引时,就会发生这种情况。当使用temporary看到这种情况时,需要优化查询。这里,MYSQL需要创建一个临时表来存储结果,这通常是按不同的列集顺序进行的,而不是通过使用Where子句来限制哪些行将匹配下一个表或返回给用户。如果不想返回表中的所有行,并且连接类型是ALL或index,就会出现这种情况,或者查询有问题。不同连接类型的解释(按效率排序)系统表只有一行:系统表。这是const连接类型的特殊情况。const:表中记录的最大值可以匹配这个查询(索引可以是主键或唯一索引)。因为只有一行,所以这个值实际上是一个常量,因为MYSQL先读取这个值,然后把它当作一个常量。eq_ref:在连接中,MYSQL为每个记录组合从前面的表中读取一个记录,当查询使用所有带有主键或唯一键的索引时,它使用ref。只有当查询使用的键不是唯一键、主键或这些类型的一部分时,才能使用此连接类型(例如,对上一个表的每个行联合使用最左边的前缀,将从表中读取所有记录。这种类型很大程度上取决于根据索引匹配的记录数量,越少越好。range:这种连接类型使用索引返回一个范围的行,比如在使用或查找某些东西时会发生什么。Index:这种连接类型完全扫描前一个表中的每一条记录(比全部好,因为索引通常比表数据小)。ALL:这种连接类型完全扫描以前的每一条记录,这通常是不好的,应该尽可能避免。
使用类似“Handler_read%”的显示状态;要理解索引的作用。
Handler_read_key值高表示索引效果好,Handler_read_rnd_next值高表示索引效率低。
使用show processlist检查当前运行状态。
mysql显示进程列表;
- - - - - - - -
Id 用户主机数据库命令时间状态信息
- - - - - - - -
207 root 192 . 168 . 0 . 20:51718 mytest Sleep 5 NULL
208 root 192 . 168 . 0 . 20:51719 mytest Sleep 5 NULL
220 root 192 . 168 . 0 . 20:51731 mytest Query 84 Locked
从id=001的book中选择bookname,culture,value,type
让我们简单谈谈每个专栏的意义和目的,
当您想要删除一个语句时,列ID(一个标识符)非常有用。使用命令kill this query /*/mysqladmin kill进程号。
“用户”列,显示上一个用户。如果不是root,这个命令将只显示您权限内的sql语句。
Host列,显示该语句是从哪个ip的哪个端口发出的。用于追踪有问题语句的用户。
Db列,它显示该进程当前连接到哪个数据库。
命令列,显示当前连接执行的命令,一般是睡眠、查询和连接。
时间列,此状态的持续时间,以秒为单位。
列状态,显示使用当前连接的sql语句的状态。这是一个重要的列,所有的状态将在后面描述。请注意,状态只是语句执行中的某个状态。一条sql语句,以查询为例,可能需要经历复制到tmp表、排序结果、发送数据等状态才能完成。
Info列,显示该sql语句。由于长度有限,长sql语句不完整,但却是判断问题语句的重要依据。
这个命令中最关键的是state列。mysql列出的状态如下:
核对表格
检查数据表(这是自动的)。
关闭表格
将表中正在修改的数据刷新到磁盘,同时关闭已经用完的表。这是一个快速操作。如果没有,您应该确定磁盘空间是否已满,或者磁盘是否负载过重。
连接出去
复制服务器正在连接到主服务器。
复制到磁盘上的tmp表
因为临时结果集大于tmp_table_size,所以临时表将从内存存储更改为磁盘存储以节省内存。
正在创建tmp表
创建一个临时表来保存一些查询结果。
从主表中删除
服务器正在执行多表删除的第一部分,并且刚刚删除了第一个表。
从引用表中删除
服务器正在执行多表删除的第二部分,删除其他表的记录。
冲洗桌子
正在执行刷新表,等待其他线程关闭数据表。
被杀死的
如果一个kill请求被发送到一个线程,该线程将检查kill标志并放弃下一个kill请求。MySQL将在每个主循环中检查kill标志位,但在某些情况下,线程死亡可能需要很短的时间。如果该线程被另一个线程锁定,那么一旦锁定被释放,kill请求就会生效。
锁定的
它被其他查询锁定。
发送数据
正在处理选择查询的记录,并将结果发送给客户端。
分组排序
分组依据。
订单排序
排序依据正在排序。
打开表格
这个过程应该很快,除非受到其他因素的干扰。例如,在ALTER TABLE或LOCK TABLE语句完成之前,数据表不能被其他线程打开。试图打开一张桌子。
删除重复项
正在执行SELECT DISTINCT查询,但是MySQL无法优化前一阶段中的那些重复记录。因此,MySQL需要再次删除重复记录,然后将结果发送给客户端。
重新打开表格
获得了表上的锁,但是在修改表结构之前无法获得锁。锁已被释放,数据表已被关闭。正在尝试重新打开数据表。
分类修复
正在对维修说明进行排序以创建索引。
用键盘锁修复
修复指令正在使用索引缓存逐个创建新的索引。这比通过排序修复要慢。
搜索要更新的行
我们正在讨论找出符合更新条件的记录。它必须在UPDATE想要修改相关记录之前完成。
睡眠
等待客户端发送新的请求。
系统锁定
等待获取外部系统锁。如果当前没有多个mysqld服务器同时请求同一个表,可以通过添加-skip - skip-external-locking参数来禁止外部系统锁。
升级锁
INSERT DELAYED试图获取一个锁表来插入新记录。
更新
搜索匹配记录并修改它们。
用户锁定
正在等待GET_LOCK()。
等待餐桌
线程被告知数据表结构已经被修改,并且需要重新打开数据表以获得新的结构。然后,为了重新打开数据表,必须等到所有其他线程都关闭该表。在下列情况下将生成此通知:刷新表TBL名称、更改表、重命名表、修复表、分析表或优化表。
等待处理程序插入
插入延迟已经处理了所有挂起的插入操作,正在等待新的请求。
大多数状态对应于快速操作。只要一个线程保持相同的状态几秒钟,就可能存在需要检查的问题。
其他状态没有在上面列出,但是大部分只对检查服务器是否有错误有用。
mysql手册里有所有状态的描述,链接如下:http://dev . MySQL . com/doc/ref man/5.0/en/general-thread-States . html。