Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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 - Fatal编程技术网

mysql查询执行耗时

mysql查询执行耗时,mysql,Mysql,我在SO中看到了几个问题,基于这些问题,我还改进了sql查询。 但有时需要12秒或3秒来执行。所以最短的时间是3秒。查询是这样的 SELECT ANALYSIS.DEPARTMENT_ID ,SCORE.ID ,SCORE.KPI_ SCORE.R_SCORE ,SCORE.FACTOR_SCORE ,SCORE.FACTOR_SCORE ,SCORE.FACTOR_SCORE ,SCORE.CREATED_DATE ,SCORE.UPDA

我在SO中看到了几个问题,基于这些问题,我还改进了sql查询。 但有时需要12秒或3秒来执行。所以最短的时间是3秒。查询是这样的

SELECT ANALYSIS.DEPARTMENT_ID
    ,SCORE.ID
    ,SCORE.KPI_ SCORE.R_SCORE
    ,SCORE.FACTOR_SCORE
    ,SCORE.FACTOR_SCORE
    ,SCORE.FACTOR_SCORE
    ,SCORE.CREATED_DATE
    ,SCORE.UPDATED_DATE
FROM SCORE_INDICATOR SCORE
    ,AG_SENTIMENT ANALYSIS
WHERE SCORE.TAG_ID = ANALYSIS.ID
    AND ANALYSIS.ORGANIZATION_ID = 1
    AND ANALYSIS.DEPARTMENT_ID IN (1,2,3,4,5)
    AND DATE (ANALYSIS.REVIEW_DATE) BETWEEN DATE ('2016-05-02') AND DATE ('2017-05-02')
ORDER BY ANALYSIS.DEPARTMENT_ID
现在,一个表的得分指示器有19345116行,之后的表总共有19057025行。我在
ORGANIZATION\u ID
department\u ID
上添加了索引,另外一个索引是
ORGANIZATION\u ID和department\u ID
的组合。有没有其他方法可以改进它,或者说我能用这么多的数据达到最大限度?

以下是检查清单:

1) 确保日志表(
ANALYSIS
)使用
MyISAM
引擎(它对于OLAP查询非常快速)

2) 确保已为分析编制索引。查看日期字段

3) 确保
ANALYSIS.REVIEW\u DATE
的类型为
DATE
(不是
CHAR
VARCHAR

4) 更改查询(重新排列查询计划):

选择
分析部门ID
,SCORE.ID
,SCORE.KPI u SCORE.R_SCORE
,SCORE.FACTOR_分数
,SCORE.FACTOR_分数
,SCORE.FACTOR_分数
,SCORE.CREATED_日期
,SCORE.UPDATED_日期
从分数到指标分数
,AG_情绪分析
哪里
SCORE.TAG_ID=ANALYSIS.ID
及
分析审查日期>='2016-05-02'和分析审查日期<'2016-05-03'
及
ANALYSIS.ORGANIZATION\u ID=1
及
分析部门ID(1,2,3,4,5)
按分析订购。部门号;
以下是检查清单:

1) 确保日志表(
ANALYSIS
)使用
MyISAM
引擎(它对于OLAP查询非常快速)

2) 确保已为分析编制索引。查看日期字段

3) 确保
ANALYSIS.REVIEW\u DATE
的类型为
DATE
(不是
CHAR
VARCHAR

4) 更改查询(重新排列查询计划):

选择
分析部门ID
,SCORE.ID
,SCORE.KPI u SCORE.R_SCORE
,SCORE.FACTOR_分数
,SCORE.FACTOR_分数
,SCORE.FACTOR_分数
,SCORE.CREATED_日期
,SCORE.UPDATED_日期
从分数到指标分数
,AG_情绪分析
哪里
SCORE.TAG_ID=ANALYSIS.ID
及
分析审查日期>='2016-05-02'和分析审查日期<'2016-05-03'
及
ANALYSIS.ORGANIZATION\u ID=1
及
分析部门ID(1,2,3,4,5)
按分析订购。部门号;

我已经更改了连接语法的顺序和样式。分数表似乎是分析表主要标准的子项。您的所有标准都基于符合条件的分析记录。现在,索引。对列执行DATE()函数调用对优化器没有帮助。因此,为了获得所有可能的日期/时间组件,我将从第一个日期改为>=第一个日期,距离结束不到一天。在您的示例中,日期(“2017-05-02”)与“2017-05-03”相同,后者将包括2017-05-02至23:59:59,并且可以更好地应用该日期

现在是索引。基于join和order by字段执行复合索引可能会有所帮助

AG_段表。。。索引(组织ID、部门ID、审核日期、ID)

选择
分析部门ID,
SCORE.ID,
SCORE.KPI u SCORE.R_SCORE,
分数,因子,分数,
分数,因子,分数,
分数,因子,分数,
SCORE.CREATED_日期,
SCORE.UPDATED\u日期
从…起
AG_情绪分析
加入分数\指标分数
ON ANALYSIS.ID=SCORE.TAG\u ID
哪里
ANALYSIS.ORGANIZATION\u ID=1
和分析。部门ID位于(1,2,3,4,5)
和分析。审查日期>='2016-05-02'
和分析。审查日期<'2017-05-03'
订购人
分析部门ID

我已经更改了连接语法的顺序和样式。分数表似乎是分析表主要标准的子项。您的所有标准都基于符合条件的分析记录。现在,索引。对列执行DATE()函数调用对优化器没有帮助。因此,为了获得所有可能的日期/时间组件,我将从第一个日期改为>=第一个日期,距离结束不到一天。在您的示例中,日期(“2017-05-02”)与“2017-05-03”相同,后者将包括2017-05-02至23:59:59,并且可以更好地应用该日期

现在是索引。基于join和order by字段执行复合索引可能会有所帮助

AG_段表。。。索引(组织ID、部门ID、审核日期、ID)

选择
分析部门ID,
SCORE.ID,
SCORE.KPI u SCORE.R_SCORE,
分数,因子,分数,
分数,因子,分数,
分数,因子,分数,
SCORE.CREATED_日期,
SCORE.UPDATED\u日期
从…起
AG_情绪分析
加入分数\指标分数
ON ANALYSIS.ID=SCORE.TAG\u ID
哪里
ANALYSIS.ORGANIZATION\u ID=1
和分析。部门ID位于(1,2,3,4,5)
和分析。审查日期>='2016-05-02'
和分析。审查日期<'2017-05-03'
订购人
分析部门ID

您是否为条件中使用的其他列定义了索引?您不需要为PK/FK定义索引,因为它们是由MySQL自动索引的。是的,有些索引显示了REVIEW\u DATE?只是为了理解,为什么您要在组织ID和部门ID上设置组合索引?您是否为该条件中使用的其他列设置了索引?您不需要为PK/FK定义索引,因为它们是由MySQL自动索引的。是的,有些索引显示了审阅日期?请理解,为什么要在组织ID和部门ID上加上组合索引?有一件事我不明白为什么我需要在主索引中加上ID,因为它已经存在了PK@vihangshah,通过包含,它成为一个覆盖索引(您可以查找),但基本上包含所有
SELECT 
    ANALYSIS.DEPARTMENT_ID
    ,SCORE.ID
    ,SCORE.KPI_ SCORE.R_SCORE
    ,SCORE.FACTOR_SCORE
    ,SCORE.FACTOR_SCORE
    ,SCORE.FACTOR_SCORE
    ,SCORE.CREATED_DATE
    ,SCORE.UPDATED_DATE
FROM SCORE_INDICATOR SCORE
    ,AG_SENTIMENT ANALYSIS
WHERE 
    SCORE.TAG_ID = ANALYSIS.ID 
  AND
    ANALYSIS.REVIEW_DATE >= '2016-05-02' AND ANALYSIS.REVIEW_DATE < '2016-05-03'
  AND
    ANALYSIS.ORGANIZATION_ID = 1
  AND 
    ANALYSIS.DEPARTMENT_ID IN (1,2,3,4,5)
ORDER BY ANALYSIS.DEPARTMENT_ID;
SELECT 
        ANALYSIS.DEPARTMENT_ID,
        SCORE.ID,
        SCORE.KPI_ SCORE.R_SCORE,
        SCORE.FACTOR_SCORE,
        SCORE.FACTOR_SCORE,
        SCORE.FACTOR_SCORE,
        SCORE.CREATED_DATE,
        SCORE.UPDATED_DATE
    FROM 
        AG_SENTIMENT ANALYSIS
            JOIN SCORE_INDICATOR SCORE
                ON ANALYSIS.ID = SCORE.TAG_ID
    where 
            ANALYSIS.ORGANIZATION_ID = 1
        AND ANALYSIS.DEPARTMENT_ID IN (1,2,3,4,5)
        AND ANALYSIS.REVIEW_DATE >= '2016-05-02'
        AND ANALYSIS.REVIEW_DATE < '2017-05-03'
    ORDER BY 
        ANALYSIS.DEPARTMENT_ID