mysql - TIMESTAMPDIFF MIN MAX 优化

标签 mysql join query-performance

我有 3 个 Innodb 表,其中 2 个是“大”

  • composer_sessions 92 行
  • session 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'

查询中使用的所有列都已建立索引。 查询中的“加入”用于清除与我们不希望出现在结果中的 IP 地址相关的数据。

是否有更好的方法来构建此查询和/或任何人都可以建议复合(多列)索引以使此查询运行得更快?

最佳答案

尝试调整您的查询以使用现代连接语法,例如

SELECT ...
  FROM tracking
  JOIN sessions ON sessions.session_ID = tracking.session_ID
  LEFT JOIN composer_sessions ON sessions.IP = composer_sessions.IP
 WHERE composer_sessions.IP IS NULL
   AND tracking.tour_ID = '102098'
 GROUP BY tracking.session_ID
HAVING ...

这还使用LEFT JOIN ... IS NULL模式来根据第三个表的内容消除不需要的行。

然后,创建一个所谓的 compound covering index在您的跟踪表上。它应按此顺序包含以下列。

    ( tour_id, session_id, timestamp, type )

这使得查询的跟踪部分可以直接从索引得到满足。查询规划器可以根据您选择的 tour_id 随机访问索引,因为该值位于索引的最左侧。然后它可以按顺序扫描索引以提取您需要的其余内容。

同样,尝试在 sessions 表上使用复合索引

   ( session_ID, IP )

看看是否有帮助。您还可以尝试以相反的顺序放置这些列。

请注意,单个列上的大量索引很少有助于提高复杂查询的性能。为此,您需要精心选择的复合索引。许多单列索引通常被认为对整体性能有害,因为它们会减慢插入和更新速度并且没有任何好处。

阅读此内容:http://use-the-index-luke.com/

关于mysql - TIMESTAMPDIFF MIN MAX 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41991592/

相关文章:

MySQL 多对一连接。如何找到最差(最低)结果和最新结果?

MySQL在引用上创建表错误

mysql - Laravel join 用于获取一对多关系?

php - 使用内部连接删除行

ios - 如何在 iOS 应用程序中计算一段时间内的 Parse API 请求?

postgresql - 如何加速分区表的服务器端聚合

php - "Centering"mysql 结果

mysqli 扩展缺少 debian

php - 如何使用内连接?

mysql查询性能低