简体   繁体   English

mysql查询执行耗时

[英]mysql query execution consuming time

I have seen several question in SO and based in that I improved my sql query also. 我在SO中看到了几个问题,并且在此基础上,我还改进了sql查询。 but it sometime take 12 second or it sometime takes 3 seconds to execute. 但有时需要12秒,或者有时需要3秒才能执行。 so minimum time we can its 3 seconds. 所以最短的时间我们可以3秒。 query is like this way 查询就是这样

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

now one table SCORE_INDIACATOR has 19345116 and later has 19057025 rows total. 现在一个表SCORE_INDIACATOR有19345116,后来共有19057025行。 and I added index on ORGANIZATION_ID and department_id and another as combination of ORGANIZATION_ID and department_id . 和我加上索引ORGANIZATION_IDdepartment_id和另一个作为组合ORGANIZATION_ID and department_id is there any other way to improve it or is it maximum I can achieve with this amount of data? 还有其他方法可以改善它吗?或者我可以用此数量的数据实现最大数量?

Here is checklist: 这是清单:

1) Make sure logs table ( ANALYSIS ) uses MyISAM engine (it's fast for OLAP queries). 1)确保日志表( ANALYSIS )使用MyISAM引擎(对于OLAP查询来说这是快速的)。

2) Make sure that You've indexed ANALYSIS.REVIEW_DATE field. 2)确保您已为ANALYSIS.REVIEW_DATE字段建立索引。

3) Make sure that ANALYSIS.REVIEW_DATE is type of DATE (not CHAR , VARCHAR ) 3)确保ANALYSIS.REVIEW_DATEDATE类型(不是CHARVARCHAR

4) Change query (rearrange query plan): 4)变更查询(重新安排查询计划):

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;

I have changed the order and style to JOIN syntax. 我已经将顺序和样式更改为JOIN语法。 The Score table seems to be the child to the primary criteria of the Analysis table. 得分表似乎是分析表的主要标准的子级。 All your criteria is based on qualifying Analysis records. 您的所有条件均基于合格的分析记录。 Now, the indexing. 现在,建立索引。 By doing a DATE() function call on a column does not help the optimizer. 通过对列执行DATE()函数调用不会对优化器有所帮助。 So, to get all possible date/time components, I have changed from between to >= the first date and LESS THAN one day beyond the end. 因此,为了获取所有可能的日期/时间组成部分,我已从> =转换为第一个日期,到结束后不到一天。 In your example DATE( '2017-05-02' ) is the same as LESS than '2017-05-03' which will include 2017-05-02 up to 23:59:59 and the date can be applied better. 在您的示例中,DATE('2017-05-02')与LESS相同,而'2017-05-03'则包含2017-05-02到23:59:59,并且可以更好地应用日期。

Now for the index. 现在为索引。 DO a compound index based on fields for join and order by might help 根据字段进行连接和排序的复合索引可能会有所帮助

AG_Segment table... index ON(Organization_ID, Department_ID, Review_Date, ID) AG_Segment表...索引打开(Organization_ID,Department_ID,Review_Date,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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM