编写SQL SELECT语句时,MySQL Query Optimizer尝试为查询执行制定最佳计划。通过在查询前面加上EXPLAIN,可以查看有关计划的信息。EXPLAIN是您可以用来了解和优化麻烦的MySQL查询的最强大的工具之一,但是令人遗憾的是,许多开发人员很少使用它。在本文中,您将了解EXPLAIN的输出内容以及如何使用它来优化架构和查询。
SELECT site_options.domain, sites_users.user, site_taxes.monthly_statement_fee, site.name, AVG(price) AS average_product_price FROM sites_orders_products, site_taxes, site, sites_users, site_options WHERE site_options.site_id = site.id AND sites_users.id = site.user_id AND site_taxes.site_id = site.id AND sites_orders_products.site_id = site.id GROUP BY site.id ORDER BY site.date_modified desc LIMIT 5;
Explain:
+------+-------------+---------------------------------+--------+-----------------+---------------+---------+---------------------------------+------+-----------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+---------------------------------+--------+-----------------+---------------+---------+---------------------------------+------+-----------+
| 1 | SIMPLE | sites | index | PRIMARY,user_id | PRIMARY | 4 | NULL | 858 | Using temporary; Using filesort |
| 1 | SIMPLE | sites_options | ref | site_id | site_id | 4 | service.sites.id | 1 | |
| 1 | SIMPLE | sites_taxes | ref | site_id | site_id | 4 | service.sites.id | 1 | |
| 1 | SIMPLE | sites_users | eq_ref | PRIMARY | PRIMARY | 4 | service.sites.user_id | 1 | |
| 1 | SIMPLE | sites_orders_products | ref | site_id | site_id | 4 | service.sites.id | 4153 | |//
+------+-------------+---------------------------------+--------+-----------------+---------------+---------+---------------------------------+------+-----------+
5 rows in set (0.00 sec)
行的含义:
ID(查询中每个SELECT的顺序标识符)
select_type(语句类型)
table(引用的表)
type(联接类型)
Possible_Keys(可以使用哪些键)
key(使用的索引key)
key_len(索引长度)
ref(依据的字段)
行(搜索的行数)
额外(其他信息)
MySQL如何连接使用的表。这是输出中最具洞察力的字段之一,因为它可以指示缺少索引或应该重新考虑查询的编写方式。可能的值为:
通常,您将把多个表连接在一起,并使用复杂的WHERE子句。仅在几列上添加索引可能并不总是有帮助,然后是时候Explain一下SELECT SQL。