使用MySQL中的EXPLAIN解释命令来检查SQL


咱们看到许多客户的系统由于SQL及数据库设计的不好因此致使许多性能上的问题,这些问题很差解决,可是能够采用一套简单的策略来检查生产系统,发现并纠正一些共性问题。mysql

很显然,您应该尽最大努力设计出最好的数据库,使其有很好的索引并在应用程序中采用高质量的SQL查询语句。可是,在不少时候,现实与设计仍是有很大的差别,这是由于网络应用程序开发速度快,再加上更新速度也很快,因此,数据库所链接的进程数也常常发生变化。sql

不幸的是,如今服务器运行速度很快,这些问题不容易察觉,只有当系统投入运行一段时间,随着用户和数据的增长,才发现问题。表中若只有10,000行的时候,任何系统都能运行的很好,可是,当表中有数百万行而SQL又不好的时候,系统就会出现问题。随着并发用户数量增多,会发出更多的并发查询,而这些查询要阅读数百万行。数据库

接下来发生的事就不尽人意了,由于服务器会运行的很慢,像蜗牛在爬,而每一个查询要花好几秒的时间才能完成任务,这样绝不费力就能使网站垮掉。这就是所谓的“瓶颈”,指的是系统一直运行的很好,但忽然有一天跨了。现今,有不少系统都会出现这样的问题。服务器

要找出问题所在并不容易,可是能够运用一些好的工具来帮忙查找问题。首先,最管用的工具就是slow log,但是,标准工具(mysqldumpslow)不会给出最重要的统计数据 – 已检查的行数。要监控系统性能,这些所谓的重要的服务器统计数据根本就算不上是好数据。请注意,还有其它的好工具,如Percona的 pt-query-profiler就很管用。 网络

当你发现SQL遇到问题,检查出有不少行的时候,你能够在这些SQL查询中,运行EXPLAIN EXTENDED命令。尽管该命令输出的内容比较复杂、难以理解,可是,你能够经过网络资源或像Percona这些工具的帮助,就能够理解命令内容。并发

可是,若是是一些像咱们所看到的简单查询的话(只有单个查询,不含子查询,这些查询因为临时表的存在可能会有不少行/表及联接)输出结果仍是容易解释的。数据库设计

检查EXPLAIN EXTENDED的输出内容(EXTENDED是比较重要的命令,由于该命令可展现许多额外信息),咱们会发现不少关键信息:Type这一列很重要,若是输出结果是All或索引,它将会要求扫描全部的表或索引。ide

Keys这一列也很重要,由于它告诉你使用了哪一个索引,若是此处为空,表示未使用任何索引,绝大多数状况下,您需解决此问题。工具

Rows这一列告知您数据库即将要阅读的行数,固然,越少越好。从理论上来说,这些未阅读的行数经阅读以后,会被记录到日志中成为已检查的行数,可是实际将要阅读的行数和EXPLAIN系统所记载的将要阅读的行数可能会有差别,这是由于EXPLAIN系统的行数只是预估的行数。请注意此处不包括LIMIT,可是LIMIT不会使要阅读的行数减小,尤为是查询中有排序要求的时候,更不会减小要阅读的行数。性能

经过借助在线资源及一些工具,您可更好地理解输出的结果。您将发现哪些SQL执行的比较慢及根源是什么,在此,您能够更改SQL、更改索引甚至是更改数据库设计以便提升系统性能。


(Authored by Steve Mushero / ChinaNetCloud CEO & CTO  本博客英文原文请点此查看

相关文章
相关标签/搜索