想知道如何加速MySQL调用

时间:2015-01-04 22:04:22

标签: mysql

我正在寻找一个答案,说明如何在500,000条记录的表格上加快查询速度。

我只是将COUNT插入BROKERAGE_STOCKS_COVERED,计算同一经纪人ESTIMID在每个记录的日期范围内显示的次数 - 不包括正在检查的记录。唯一的另一个条件是ANALYST不是空白。

我在桌面上做了​​很多类似的电话 - 他们都回来了10 ...也许15秒。与此调用和我的其他调用的唯一区别是,此调用返回COUNT最多1000 BROKERAGE_STOCKS_COVERED - 而我的其他查询可能导致3或4 COUNT。这个需要几乎整整一个小时:/ /


UPDATE `working` SET `BROKERAGE_STOCKS_COVERED` = 
    (SELECT COUNT(`ID`) 
     FROM ( SELECT `ID`, `ESTIMID`, `ANNDATS_CONVERTED`, 
                   `ANALYST`, `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` != ''
    )
WHERE `working`.`ANALYST` != '';

- 0 500,000行“457656行受影响。(查询花了2782.4304秒。)”(46分钟)


| ID | ANALYST |   ESTIMID    | ANNDATS_CONVERTED | REVDATS_CONVERTED |  BROKERAGE_STOCKS_COVERED  | NO_TOP_RATING |  
--------------------------------------------------------------------------------------------------------------------
| 1  |  DAVE   | Brokerage000 |    1998-07-01     |    1998-07-04     |                            |      3        |
| 2  |  DAVE   | Brokerage000 |    1998-06-28     |    1998-07-10     |                            |      4        |
| 3  |  DAVE   | Brokerage000 |    1998-07-02     |    1998-07-08     |                            |      2        |
| 4  |  DAVE   | Brokerage000 |    1998-07-04     |    1998-12-04     |                            |      3        |
| 5  |  SAM    | Brokerage000 |    1998-06-14     |    1998-06-30     |                            |      4        |
| 6  |  SAM    | Brokerage000 |    1998-06-28     |    1999-08-08     |                            |      4        |
| 7  |         | Brokerage000 |    1998-06-28     |    1999-08-08     |                            |      5        |
| 8  |  DAVE   | Brokerage111 |    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>       | ref   | <auto_key0>   | <auto_key0> | 92      | working.ESTIMID  | 46785  | Using where
3 | DERIVED            | working          | ALL   | NULL          | NULL        | NULL    | NULL             | 467847 | NULL

EXPLAIN

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

id | select_type | table       | type   | possible_keys | key  | key_len | ref  | rows   | Extra 
--------------------------------------------------------------------------------------------------  
1  | PRIMARY     | <derived2>  | ALL    | NULL          | NULL | NULL    | NULL | 462762 | NULL
2  | DERIVED     | working     | ALL    | NULL          | NULL | NULL    | NULL | 462762 | NULL

EXPLAIN

SELECT COUNT(`ID`) FROM (SELECT `ID`, `IRECCD`, `ANALYST`, `ESTIMID`, `ANNDATS_CONVERTED`, `REVDATS_CONVERTED` FROM `working`) AS BB 
WHERE 
BB.`ANNDATS_CONVERTED` <= `ANNDATS_CONVERTED` 
AND 
BB.`REVDATS_CONVERTED` > `ANNDATS_CONVERTED` 
AND 
BB.`ID` != `ID` 
AND 
BB.`ESTIMID` = `ESTIMID` 
AND 
BB.`ANALYST` != '' 

id | select_type  | table   | type  | possible_keys | key   | key_len   | ref   | rows   | Extra    
----------------------------------------------------------------------------------------------------
1  | PRIMARY      |NULL     | NULL  | NULL          | NULL  |  NULL     | NULL  | NULL   | Impossible WHERE
2  | DERIVED      | working | ALL   | NULL          | NULL  | NULL      | NULL  | 462762 | NULL
  • 我认为“不可能的WHERE”只是因为为了显示“EXPLAIN
  • 而将查询的这一部分与UPDATE分开了

我在Windows 8 PHP / MySQL安装上使用 InnoDB 。 我的专栏已编入索引。我的Windows / MySQL /上有内存最大值  这一切都很棒。

- 只是想知道这是否是这种查询的正常等待时间?

- 有没有办法加快这个特定的查询?

1 个答案:

答案 0 :(得分:1)

通常 - 在尝试优化慢速运行查询时,会要求数据库系统解释它解析查询的策略。在这种情况下,您可以在子选择上单独使用SQL Explain command,在where子句中使用{{3}}来查找减速的确切原因。这可能表明您的where子句是否应该存在于子选择之外,或者问题是否存在于其他地方。