Mysql CakePHP具有SUM查询超流-哪里有改进的空间?

Mysql CakePHP具有SUM查询超流-哪里有改进的空间?,mysql,cakephp,having,cakephp-2.5,Mysql,Cakephp,Having,Cakephp 2.5,此查询将终止整个页面(90%的请求时间): /** *检查是否存在包含这些用户的对话(至少两个!) *//托多:修理我!超慢!6秒页面总加载量为5秒 * *@param array$要检查的用户 *@param int$limit-limit至少需要2个用户 *@返回数组结果 */ 转换的公共功能部分($users,$limit=5){ $options=array( 'conditions'=>array('ConversationUser.status除了确保通过该查询的索引对sql表进行优

此查询将终止整个页面(90%的请求时间):

/**
*检查是否存在包含这些用户的对话(至少两个!)
*//托多:修理我!超慢!6秒页面总加载量为5秒
*
*@param array$要检查的用户
*@param int$limit-limit至少需要2个用户
*@返回数组结果
*/
转换的公共功能部分($users,$limit=5){
$options=array(

'conditions'=>array('ConversationUser.status除了确保通过该查询的索引对sql表进行优化外,我认为您还应该添加另一个条件-仅添加那些具有可接受用户id的记录

这是适当的WHERE子句

WHERE `ConversationUser`.`status` < 7 
  AND `ConversationUser`.`user_id` in 
    ('2ed23d7c-dcc8-4d3b-8e7b-0fe018b0f9bf', '297e0fcc-8880-4bc7-9b57-0ba418b0f9bf')
WHERE`ConversationUser`.`status`<7
和'ConversationUser`.'user\u id`in
('2ed23d7c-dcc8-4d3b-8e7b-0fe018b0f9bf','297e0fcc-8880-4bc7-9b57-0ba418b0f9bf')
将PHP代码更改为:

public function partOfConversations($users, $limit = 5) {
    $options = array(
        'conditions' => array('ConversationUser.status <' => ConversationUser::STATUS_REMOVED
                              ,'ConversationUser.user_id' => $users),
        'group' => array('ConversationUser.conversation_id HAVING SUM(CASE WHEN ConversationUser.`user_id` in (\'' . implode('\', \'', $users) . '\') THEN 1 ELSE 0 END) = ' . count($users) . ''),
        'contain' => array('Conversation' => array('LastMessage')),
        'limit' => $limit,
        'order' => array('Conversation.last_message_id' => 'DESC')
    );
    return $this->ConversationUser->find('all', $options);
}
转换的公共功能部分($users,$limit=5){ $options=array(
“conditions”=>array('ConversationUser.status)您可以提供有关数据库上的表结构的更多详细信息吗?例如,对于此查询中使用的表,您有哪些索引?添加到@gurel_kaynak请求中,您应该通过另一个工具(例如,命令行)运行该查询前面是术语
EXPLAIN
。它将显示所使用的索引。IMO:您需要一个关于comm\u conversation\u users的索引。状态。索引是conversation:id(主)、user\u id-conversation user:id(主)、user\u id、conversation\u id。添加状态索引没有帮助。但该字段已经很小(2)无论如何。太棒了!问题是,在另一个类似的查询中,我似乎有那个附加的子句。我不知道为什么我在这个问题上不再有它了。但是它现在运行得非常快。非常感谢!
WHERE `ConversationUser`.`status` < 7 
  AND `ConversationUser`.`user_id` in 
    ('2ed23d7c-dcc8-4d3b-8e7b-0fe018b0f9bf', '297e0fcc-8880-4bc7-9b57-0ba418b0f9bf')
public function partOfConversations($users, $limit = 5) {
    $options = array(
        'conditions' => array('ConversationUser.status <' => ConversationUser::STATUS_REMOVED
                              ,'ConversationUser.user_id' => $users),
        'group' => array('ConversationUser.conversation_id HAVING SUM(CASE WHEN ConversationUser.`user_id` in (\'' . implode('\', \'', $users) . '\') THEN 1 ELSE 0 END) = ' . count($users) . ''),
        'contain' => array('Conversation' => array('LastMessage')),
        'limit' => $limit,
        'order' => array('Conversation.last_message_id' => 'DESC')
    );
    return $this->ConversationUser->find('all', $options);
}