繁体   English   中英

正确索引MySQL表

[英]Proper Indexing MySQL Table

我似乎无法让这个查询执行任何超过8小时 0_0我已阅读索引,但我仍然不确定我是否正确。

我期待我的查询根据日期和其他行值计算BROK_1_RATING的值BROK_1_RATING 条记录

以记录#1为例 - 我的查询应该:

  • 获取具有相同ESTIMID所有其他记录

  • 忽略ANALYST =“”的记录

  • 忽略ID与被比较的记录相同的记录,即ID != 1

  • 记录必须在一个时间范围内,即BB。 ANNDATS_CONVERTED <= working ANNDATS_CONVERTED ,BB。 REVDATS_CONVERTED > working ANNDATS_CONVERTED

  • BB。 IRECCD必须= 1

  • 然后计算结果

  • 然后将计数值写入BROK_1_RATING列以记录#1

  • 现在对于记录#2和#3等同样对整个表执行相同的操作

在人类术语中 - “检查记录#1的日期 - 现在,在记录#1的时间范围内 - 计算具有相同经纪人ESTIMID的数字1存在的ESTIMID ,不计算记录#1,不计算空白ANALYST行。继续录制#2并做同样的事情


UPDATE `working` SET `BROK_1_RATING` = 

    (SELECT COUNT(`ID`) FROM (SELECT `ID`, `IRECCD`, `ANALYST`,  `ESTIMID`, `ANNDATS_CONVERTED`, `REVDATS_CONVERTED` FROM `working`) AS BB 

        WHERE 
            BB.`ANNDATS_CONVERTED` <= `working`.`ANNDATS_CONVERTED` 
        AND 
            BB.`REVDATS_CONVERTED` > `working`.`ANNDATS_CONVERTED`
        AND 
            BB.`ID` != `working`.`ID`
        AND 
            BB.`ESTIMID` = `working`.`ESTIMID`
        AND
            BB.`ANALYST` != ''
        AND
            BB.`IRECCD` = 1
    )

WHERE `working`.`ANALYST` != '';

| ID | ANALYST |   ESTIMID    | IRECCD | ANNDATS_CONVERTED | REVDATS_CONVERTED |  BROK_1_RATING  | NO_TOP_RATING |  
------------------------------------------------------------------------------------------------------------------
| 1  |  DAVE   | Brokerage000 |   4    |    1998-07-01     |    1998-07-04     |                 |      3        |
| 2  |  DAVE   | Brokerage000 |   1    |    1998-06-28     |    1998-07-10     |                 |      4        |
| 3  |  DAVE   | Brokerage000 |   5    |    1998-07-02     |    1998-07-08     |                 |      2        |
| 4  |  DAVE   | Brokerage000 |   1    |    1998-07-04     |    1998-12-04     |                 |      3        |
| 5  |  SAM    | Brokerage000 |   1    |    1998-06-14     |    1998-06-30     |                 |      4        |
| 6  |  SAM    | Brokerage000 |   1    |    1998-06-28     |    1999-08-08     |                 |      4        |
| 7  |         | Brokerage000 |   1    |    1998-06-28     |    1999-08-08     |                 |      5        |
| 8  |  DAVE   | Brokerage111 |   2    |    1998-06-28     |    1999-08-08     |                 |      3        |

'EXPLAIN'结果:

id| select_type        | table            | type  | possible_keys | key                   | key_len | ref   | rows   | Extra
----------------------------------------------------------------------------------------------------------------------------------------
1 | PRIMARY            | working          | index | ANALYST       | PRIMARY               | 4       | NULL  | 467847 | Using where
2 | DEPENDENT SUBQUERY | <derived3>       | ALL   | NULL          | NULL                  | NULL    | NULL  | 467847 | Using where
3 | DERIVED            | working          | index | NULL          | test_combined_indexes | 226     | NULL  | 467847 | Using index

我在单列上有索引 - 以及 - 尝试了多个列索引,如下所示:

ALTER TABLE `working` ADD INDEX `test_combined_indexes` (`IRECCD`, `ID`, `ANALYST`, `ESTIMID`, `ANNDATS_CONVERTED`, `REVDATS_CONVERTED`) COMMENT '';

那么你可以通过删除额外的东西来缩短查询:

UPDATE `working` as AA SET `BROK_1_RATING` = 
(SELECT COUNT(`ID`) FROM `working` AS BB 
    WHERE BB.`ANNDATS_CONVERTED` <= AA.`ANNDATS_CONVERTED` 
    AND BB.`REVDATS_CONVERTED` > AA.`ANNDATS_CONVERTED`
    AND BB.`ID` != AA.`ID`
    AND BB.`ESTIMID` = AA.`ESTIMID`
    AND BB.`ANALYST` != ''
    AND BB.`IRECCD` = 1 )
WHERE `ANALYST` != '';

暂无
暂无

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

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