我在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可能是关键。
或者这是一个查询问题而不是索引问题?
先谢谢。
答案 0 :(得分:1)
根据你的解释,我可以判断交换订单。
对于来自twk-status
的每条记录,正在搜索groups
的相应记录,因为您在其他记录中有PRIMARY KEY
个加入条件(twk-status.groupID = groups.ID
)
但是,我几乎可以肯定此EXPLAIN
存在问题,因为MySQL
无法交换LEFT JOIN
的订单。
您能否发布EXPLAIN
的确切输出?
<强>更新强>
在构建计划时,MySQL
检查在索引字段中搜索的常量值是否存在。
其中一些检查失败。不可能确切地说出哪一个,但是groupID = 11
中的twk-status
或enddate >= FROM_UNIXTIME(1317204000)
的记录都没有。
MySQL
刚刚将整个联接替换为twk-status
的空行值,并将其与包含groupID = 11
的组的数据一起返回。