2015-01-04 3 views
0

Я ищу ответ о том, как я могу ускорить свой запрос на столе в 500 000 записей.Удивительно, как я могу ускорить вызов MySQL

Я просто вставляя 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` != ''; 

- 0n 500000 строк "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 
  • Я думаю, что "невозможно КУДА" только потому, что эта часть запроса отделена от UPDATE для цель отображения «EXPLAIN

Я использую InnoDB на windows 8 PHP/MySQL install. Мои колонки индексируются. У меня есть память maxed на моих окнах/MySQL/ , и все это отлично работает.

- Просто интересно, нормально ли это время ожидания для такого запроса?

- И есть способ ускорить этот конкретный запрос?

ответ

1

Как правило, при попытке оптимизировать медленный запрос - попросить систему базы данных объяснить ее стратегию разрешения запроса. В этом случае вы можете использовать SQL Explain command, на суб-выбор и независимо друг от друга и на предложение where, чтобы найти точную причину замедления. Это может указывать, должно ли ваше предложение where существовать вне подвыборки, или если проблема лежит в другом месте.

+0

Я добавил результаты «EXPLAIN». Любая помощь с тем, что искать здесь, будет оценена по достоинству. – Kreeverp

+0

Конечно! Поскольку вы не опубликовали полный ввод объяснений, я предполагаю, что вы могли попросить MySQL объяснить план для всего состояния обновления, как показано выше, и вы уже приобрели ~ 10K строк. Результаты говорят о самой большой карьере ('select ... fields ... FROM working') эффективно выполняет линейное сканирование по всем строкам. В тех случаях, когда предложения во втором карьере приводят к уменьшению порядка в рассматриваемых строках. Третий результат снова рассматривает все строки в таблице. Я бы рассмотрел возможность удаления внутренней группы с помощью 'group by' или' having'. – Mark

+0

Спасибо, это типично для запроса, который занимает это долго на столе из 500000 строк? – Kreeverp

Смежные вопросы