我不是SQL方面的专家,必须优化经常执行的查询,并导致问题太慢。
INNER JOIN
速度太慢,但每个表中的查询速度都非常快。如何优化查询?
表格结构:
user
有许多threads
,每个thread
都有许多messages
。 messages
表有几百万行。
我需要的是是计算特定用户拥有并在两个日期之间发送的线程的消息。
内连接需要太长时间,但是进行一些测试我发现没有连接的查询非常快:
/* 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