Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 时间差最小最大优化_Mysql_Join_Query Performance - Fatal编程技术网

Mysql 时间差最小最大优化

Mysql 时间差最小最大优化,mysql,join,query-performance,Mysql,Join,Query Performance,我有3个Innodb表,其中2个是大的 composer_会话92行 会话2530587行 跟踪8032697行 我正在运行以下查询: SELECT TIMESTAMPDIFF(SECOND, MIN(tracking.timestamp), MAX(tracking.timestamp) ) AS `thetime`, SUM(tracking.type = 'scene') AS `scenec

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

composer_会话92行 会话2530587行 跟踪8032697行 我正在运行以下查询:

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 ...
这也使用了左连接。。。是NULL模式,用于根据第三个表的内容消除不需要的行

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

    ( tour_id, session_id, timestamp, type )
这允许直接从索引中满足查询的跟踪部分。查询计划器可以根据您选择的巡更id随机访问索引,因为该值在索引中最左侧。然后,它可以按顺序扫描索引,以提取出所需的其余内容

类似地,在上的会话表上尝试使用复合索引

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

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


阅读以下内容:

尝试使用HAVING子句中的time,而不是重复计算。不过,我不确定这是否会产生影响。请尝试用左连接/NULL模式替换not IN测试。您可能需要阅读此部分,尤其是有关查询性能问题的部分。请为这些表提供“显示创建表”。查询中使用的所有列都编制了索引,这太不精确了。
   ( session_ID, IP )