sql - MySQL,阅读这条 EXPLAIN 语句

标签 sql mysql database database-design

我有一个查询开始在我的应用程序中引起一些关注。我试图更好地理解此 EXPLAIN 语句,以了解可能缺少索引的位置:

            +----+-------------+-------+--------+---------------+------------+---------+-------------------------------+------+---------------------------------+
            | id | select_type | table | type   | possible_keys | key        | key_len | ref                           | rows | Extra                           |
            +----+-------------+-------+--------+---------------+------------+---------+-------------------------------+------+---------------------------------+
            |  1 | SIMPLE      | s     | ref    | client_id     | client_id  | 4       | const                         |  102 | Using temporary; Using filesort |
            |  1 | SIMPLE      | u     | eq_ref | PRIMARY       | PRIMARY    | 4       | www_foo_com.s.user_id         |    1 |                                 |
            |  1 | SIMPLE      | a     | ref    | session_id    | session_id | 4       | www_foo_com.s.session_id      |    1 | Using index                     |
            |  1 | SIMPLE      | h     | ref    | email_id      | email_id   | 4       | www_foo_com.a.email_id        |   10 | Using index                     |
            |  1 | SIMPLE      | ph    | ref    | session_id    | session_id | 4       | www_foo_com.s.session_id      |    1 | Using index                     |
            |  1 | SIMPLE      | em    | ref    | session_id    | session_id | 4       | www_foo_com.s.session_id      |    1 |                                 |
            |  1 | SIMPLE      | pho   | ref    | session_id    | session_id | 4       | www_foo_com.s.session_id      |    1 |                                 |
            |  1 | SIMPLE      | c     | ALL    | userfield     | NULL       | NULL    | NULL                          | 1108 |                                 |
            +----+-------------+-------+--------+---------------+------------+---------+-------------------------------+------+---------------------------------+
            8 rows in set (0.00 sec)

I'm trying to understand where my indexes are missing by reading this EXPLAIN statement. Is it fair to say that one can understand how to optimize this query without seeing the query at all and just look at the results of the EXPLAIN?

It appears that the ALL scan against the 'c' table is the achilles heel. What's the best way to index this based on constant values as recommended on MySQL's documentation? |

Note, I also added an index to userfield in the cdr table and that hasn't done much good either.

Thanks.

--- edit ---

Here's the query, sorry -- don't know why I neglected to include it the first pass through.

SELECT s.`session_id` id,
                  DATE_FORMAT(s.`created`,'%m/%d/%Y') date,
                  u.`name`,
                  COUNT(DISTINCT c.id) calls,
                  COUNT(DISTINCT h.id) emails,
                  SEC_TO_TIME(MAX(DISTINCT c.duration)) duration,
                  (COUNT(DISTINCT em.email_id) + COUNT(DISTINCT pho.phone_id) > 0) status
           FROM `fa_sessions` s
           LEFT JOIN `fa_users` u ON s.`user_id`=u.`user_id`
           LEFT JOIN `fa_email_aliases` a ON a.session_id = s.session_id
           LEFT JOIN `fa_email_headers` h ON h.email_id = a.email_id
           LEFT JOIN `fa_phones` ph ON ph.session_id = s.session_id
           LEFT JOIN `fa_email_aliases` em ON em.session_id = s.session_id AND em.status = 1
           LEFT JOIN `fa_phones` pho ON pho.session_id = s.session_id AND pho.status = 1
           LEFT JOIN `cdr` c ON c.userfield = ph.phone_id
           WHERE s.`partner_id`=1
           GROUP BY s.`session_id`      

最佳答案

我假设您已经看过 here获取有关它告诉您的内容的更多信息。显然,ALL 意味着它要遍历所有这些。该页面上讨论了使用临时文件和使用文件排序。你可能想看看那个。

来自页面:

Using filesort

MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause. The keys then are sorted and the rows are retrieved in sorted order. See Section 7.2.12, “ORDER BY Optimization”.

Using temporary

To resolve the query, MySQL needs to create a temporary table to hold the result. This typically happens if the query contains GROUP BY and ORDER BY clauses that list columns differently.

我同意看到查询可能有助于更好地解决问题。

关于sql - MySQL,阅读这条 EXPLAIN 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/222319/

相关文章:

mysql - 我按类型分组并计数自连接表以获取摘要

mysql - phpmyadmin 上的重复条目

sql - Drupal 正在寻找一个不再存在的字段

mysql - Zend 2 子查询列

sql - 跨过程共享临时表被认为是不好的形式吗?

php - SQL行自行删除

mysql - mysql中如何计算权重

regex - PostgreSQL - 使用正则表达式拆分行

数据库未打开: queries allowed on fixed tables/views only Error

php - 如果在事务期间失败,则删除文件,如何恢复/回滚之前执行的查询