【发布时间】:2017-04-28 10:37:21
【问题描述】:
我不是 SQL 方面的专家,我必须优化一个经常执行的查询,并且会因为太慢而导致问题。
INNER JOIN 太慢了,但是每个表中相同的查询都非常快。如何优化查询?
表结构:
user有很多threads,每个thread有很多messages。 messages 表有几百万行。
我需要的是统计特定用户拥有并在两个日期之间发送的线程的消息。
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 相同
【问题讨论】:
-
但你还是要使用索引