Я ищу ответ о том, как я могу ускорить свой запрос на столе в 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/ , и все это отлично работает.
- Просто интересно, нормально ли это время ожидания для такого запроса?
- И есть способ ускорить этот конкретный запрос?
Я добавил результаты «EXPLAIN». Любая помощь с тем, что искать здесь, будет оценена по достоинству. – Kreeverp
Конечно! Поскольку вы не опубликовали полный ввод объяснений, я предполагаю, что вы могли попросить MySQL объяснить план для всего состояния обновления, как показано выше, и вы уже приобрели ~ 10K строк. Результаты говорят о самой большой карьере ('select ... fields ... FROM working') эффективно выполняет линейное сканирование по всем строкам. В тех случаях, когда предложения во втором карьере приводят к уменьшению порядка в рассматриваемых строках. Третий результат снова рассматривает все строки в таблице. Я бы рассмотрел возможность удаления внутренней группы с помощью 'group by' или' having'. – Mark
Спасибо, это типично для запроса, который занимает это долго на столе из 500000 строк? – Kreeverp