gpt4 book ai didi

mysql - 正确索引 MySQL 表

转载 作者:可可西里 更新时间:2023-11-01 07:44:31 24 4
gpt4 key购买 nike

我似乎无法让此查询的执行速度超过 8 小时! 0_0我已经阅读了有关索引的内容,但我仍然不确定自己是否做对了。

我期望我的查询根据日期和其他行值计算 BROK_1_RATING 的值 - 500,000 条记录

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

  • 获取具有相同ESTIMID

    的所有其他记录
  • 忽略 ANALYST =""

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

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

  • BB.IRECCD 必须 = 1

  • 然后统计结果

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

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

用人话来说 - “检查记录 #1 的日期 - 现在,在记录 #1 的时间范围内 - 计算数字 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` != '';

关于mysql - 正确索引 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27827058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com