慢问什么错了?

时间:2010-12-23 15:33:17

标签: sql mysql indexing key

我在slowquerys日志中发现了这个查询。

SELECT GREATEST( IFNULL(`twk-status`.`status`,0) , `groups`.`status`)
FROM `groups` 
LEFT JOIN `twk-status` ON
    (`twk-status`.`groupID` = `groups`.`ID`
    AND `twk-status`.`startdate` <= FROM_UNIXTIME(1317204000)
    AND `twk-status`.`enddate` >= FROM_UNIXTIME(1317204000)
    AND ISNULL(`twk-status`.`deleted`)
    AND `twk-status`.`groupID` = 11)
WHERE `groups`.`ID` = 11;

我使用EXPLAIN运行查询,生成以下报告:

id  table       possible_keys                  key 
1   twk-status  groupID,groupID_2,enddate      NULL
1   groups      PRIMARY                        PRIMARY

这意味着mysql没有使用 twk-status 表的三个可能键中的任何一个。正确的吗?

这是来自twk-status

的密钥
groupID (groupID)
groupID_2 (groupID, startdate, enddate, deleted)  
enddate (enddate, createdate, deleted)

查询使用 groupID,startdate,enddate,deleted 我认为groupID_2可能是关键。

或者这是一个查询问题而不是索引问题?

先谢谢。

1 个答案:

答案 0 :(得分:1)

根据你的解释,我可以判断交换订单。

对于来自twk-status的每条记录,正在搜索groups的相应记录,因为您在其他记录中有PRIMARY KEY个加入条件(twk-status.groupID = groups.ID

但是,我几乎可以肯定此EXPLAIN存在问题,因为MySQL无法交换LEFT JOIN的订单。

您能否发布EXPLAIN的确切输出?

<强>更新

在构建计划时,MySQL检查在索引字段中搜索的常量值是否存在。

其中一些检查失败。不可能确切地说出哪一个,但是groupID = 11中的twk-statusenddate >= FROM_UNIXTIME(1317204000)的记录都没有。

MySQL刚刚将整个联接替换为twk-status的空行值,并将其与包含groupID = 11的组的数据一起返回。