【发布时间】:2017-02-01 23:14:48
【问题描述】:
我有 3 个 Innodb 表,其中 2 个是“大”的
- composer_sessions 92 行
- 会话 2,530,587 行
- 跟踪 8,032,697 行
我正在运行以下查询:
SELECT TIMESTAMPDIFF(SECOND,
MIN(tracking.timestamp),
MAX(tracking.timestamp) ) AS `thetime`,
SUM(tracking.type = 'scene') AS `scenecount`
FROM `tracking`, `sessions`
WHERE tracking.tour_ID = '102098'
AND sessions.session_ID = tracking.session_ID
AND sessions.IP NOT IN(SELECT DISTINCT `IP`
FROM `composer_sessions`)
GROUP BY tracking.session_ID
HAVING TIMESTAMPDIFF(SECOND, MIN(tracking.timestamp),
MAX(tracking.timestamp)) <= '3600'
AND TIMESTAMPDIFF(SECOND, MIN(tracking.timestamp),
MAX(tracking.timestamp) ) > '60'
AND SUM(tracking.type = 'scene') >= '2'
查询中使用的所有列都已编入索引。 查询中的“join”用于清除与我们不希望出现在结果中的 IP 地址相关的数据。
我是否有更好的方法来构建此查询和/或任何人都可以建议复合(多列)索引以使此查询运行得更快?
【问题讨论】:
-
尝试在
HAVING子句中使用thetime,而不是重复计算。不过,我不确定它是否会有所作为。 -
尝试用
LEFT JOIN/NULL模式替换NOT IN测试。 -
您可能想阅读这篇文章,尤其是关于查询性能问题的部分。 meta.stackoverflow.com/questions/271055/…
-
请为表格提供
SHOW CREATE TABLE。 “查询中使用的所有列都已编入索引”太不精确了。
标签: mysql join query-performance