【问题标题】:INNER JOIN takes too long, each query doesn'tINNER JOIN 耗时太长,每个查询都不会
【发布时间】:2017-04-28 10:37:21
【问题描述】:

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

INNER JOIN 太慢了,但是每个表中相同的查询都非常快。如何优化查询?

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

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

inner join 耗时太长,但做了一些测试发现没有join的查询速度很快:

/* 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 相同

【问题讨论】:

  • 但你还是要使用索引

标签: mysql sql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2018-10-06
    • 2015-07-11
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多