【发布时间】:2010-09-18 08:23:55
【问题描述】:
我有一个查询开始在我的应用程序中引起一些关注。我试图更好地理解这个 EXPLAIN 语句,以了解可能缺少索引的位置:
+----+-------------+--------+--------+------------- --+------------+---------+------------ --------+------+----------------------------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+--------+------------- --+------------+---------+------------ --------+------+----------------------------------+ | 1 |简单 |小号 |参考 |客户 ID |客户 ID | 4 |常量 | 102 |使用临时的;使用文件排序 | | 1 |简单 |你| eq_ref |初级 |初级 | 4 | www_foo_com.s.user_id | 1 | | | 1 |简单 |一个 |参考 | session_id | session_id | 4 | www_foo_com.s.session_id | 1 |使用索引 | | 1 |简单 | h |参考 | email_id | email_id | 4 | www_foo_com.a.email_id | 10 |使用索引 | | 1 |简单 |酸碱度 |参考 | session_id | session_id | 4 | www_foo_com.s.session_id | 1 |使用索引 | | 1 |简单 |时间 |参考 | session_id | session_id | 4 | www_foo_com.s.session_id | 1 | | | 1 |简单 |河粉 |参考 | session_id | session_id | 4 | www_foo_com.s.session_id | 1 | | | 1 |简单 | c |全部 |用户字段 |空 |空 |空 | 1108 | | +----+-------------+--------+--------+------------- --+------------+---------+------------ --------+------+---------------------------------+ 8 行一组(0.00 秒)我试图通过阅读这个 EXPLAIN 语句来了解我的索引在哪里丢失。不看查询,只看EXPLAIN的结果就可以理解如何优化这个查询,这样说公平吗?
似乎对“c”表的 ALL 扫描是致命弱点。根据 MySQL 文档中推荐的常量值来索引它的最佳方法是什么? |
请注意,我还在 cdr 表中的用户字段中添加了一个索引,但效果也不太好。
谢谢。
--- 编辑---
这是查询,抱歉——不知道为什么我在第一次通过时忽略了它。
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`
【问题讨论】:
-
尝试使用 FORCE INDEX e 看看该计划会发生什么。示例:LEFT JOIN
cdrc FORCE INDEX (index_name_for_userfield) ON c.userfield = ph.phone_id。用它来回答确实可以解决它。
标签: sql mysql database database-design