INNER JOIN花费的时间太长,每个查询都没有

时间:2017-04-28 01:53:04

标签: mysql sql

我不是SQL方面的专家,必须优化经常执行的查询,并导致问题太慢。

INNER JOIN速度太慢,但每个表中的查询速度都非常快。如何优化查询?

表格结构: user有许多threads,每个thread都有许多messagesmessages有几百万行

我需要的是是计算特定用户拥有并在两个日期之间发送的线程的消息。

内连接需要太长时间,但是进行一些测试我发现没有连接的查询非常快:

/* duration: 3.410, very slow! */
SELECT
    COUNT(*) 
FROM 
    `message` 
INNER JOIN 
    `thread` ON ( `message`.`thread_id` = `thread`.`id` ) 
WHERE
    (`message`.`sent_date` BETWEEN '2017-04-01 06:02:00' AND '2017-04-28 01:11:02' AND `thread`.`user_id` = 32);

/* duration: 0.157, fast */
SELECT 
    COUNT(*) 
FROM 
    `message` 
WHERE 
    (`message`.`sent_date` BETWEEN '2017-04-01 06:02:00' AND '2017-04-28 01:11:02' );

/* duration: 0.077, faster */
SELECT 
    COUNT(*) 
FROM
    `thread` 
WHERE 
    (`thread`.`user_id` = 32);

sent_date字段已编入索引,与每个fk

相同

1 个答案:

答案 0 :(得分:0)

使用EXPLAIN查找问题。在查询中使用索引和键可以快速查找具有特定列值的行(有关详细信息,请参阅how to use index forced)。