|
[MySQL]: Почему UPDATE медленнее чем SELECT? | ☑ | ||
---|---|---|---|---|
0
Брудвар
17.11.17
✎
11:39
|
Такой Апдейт:
UPDATE e INNER JOIN src using (`email`) INNER JOIN al on UPPER(src.`title`) = UPPER(al.`alias`) SET e.`title_id` = al.`title_id` WHERE e.title_id = 0 AND e.source_id = 0 Такой Селект, полностью аналогичный: SELECT * FROM e INNER JOIN src using (`email`) INNER JOIN al on UPPER(src.`title`) = UPPER(al.`alias`) WHERE e.title_id = 0 AND e.source_id = 0 В результате SELECT выполняется за несколько секунд, нашел 0 (ноль) записей, а UPDATE работал больше двух часов, но так и не закончил. В чем причина? Как оптимизировать? |
|||
1
Широкий
17.11.17
✎
11:41
|
Например индексы перестраиваются
|
|||
2
Ёпрст
17.11.17
✎
11:42
|
потому, что запрос полный ПЭ.
|
|||
3
Ёпрст
17.11.17
✎
11:43
|
у тебя e никак не связана с al и с src
|
|||
4
Ёпрст
17.11.17
✎
11:44
|
нафига там иннер впёрся - неясно. Я бы тоже на месте sql сервера задумался, че ты хочешь вот ю вонт ?
|
|||
5
Брудвар
17.11.17
✎
11:44
|
(1) Какие индексы, где перестраиваются?
(2) Конечно, КО! Иначе бы он не тормозил и этой темы бы не существовало. |
|||
6
Брудвар
17.11.17
✎
11:45
|
(3) связан же. Посмотри еще раз:
e INNER JOIN src using (`email`) |
|||
7
Ёпрст
17.11.17
✎
11:48
|
(6) ааа.. дурацкий синтаксис mysql
|
|||
8
Ёпрст
17.11.17
✎
11:53
|
у тя title_id и source_id - числовые поля ?
|
|||
9
Брудвар
17.11.17
✎
11:57
|
(8) Да
|
|||
10
Ёпрст
17.11.17
✎
12:08
|
вообще, нажми на я в верхнем углу. Там есть похожие запросы.
ХЗ, mysql не особо юзал |
|||
11
Брудвар
17.11.17
✎
12:16
|
(10) в Я всякая хрень, смотрел уже.
У меня тут два запроса которые по логике должны работать абсолютно одинаково по времени, а работают совсем не по логике. Нужно разобраться почему так. Как ускорить я и так знаю. |
|||
12
Брудвар
17.11.17
✎
12:19
|
Вот такой эксперимент работает как и положено, не долго:
UPDATE e INNER JOIN (SELECT e.id, al.`title_id` FROM e INNER JOIN src using (`email`) INNER JOIN al on UPPER(src.`title`) = UPPER(al.`alias`) WHERE e.title_id = 0 AND e.source_id = 0) t1 using (`id`) SET e.`title_id` = t1.`title_id` |
|||
13
Ёпрст
17.11.17
✎
12:19
|
(11) ну не знаю, что ты там смотрел, первые же ссылки говорят, что инсерт и апдейт вmysql зло и куча веток по оптимизации и настроек самого mysql
|
|||
14
Брудвар
17.11.17
✎
12:47
|
(13) Там абсолютно другие случаи. У меня на сервере ни апдейты, ни селекты не тормозят.
Тормозит только один конкретный запрос. |
|||
15
Широкий
17.11.17
✎
13:05
|
триггеры?
|
|||
16
youalex
17.11.17
✎
13:10
|
скорее всего мимо , но в tsql - функции (UPPER, LEN, и др и пр) - убивают поиск по индексу.
|
|||
17
Брудвар
17.11.17
✎
13:19
|
Да это все очевидные факты, но к решению проблемы не имеют никакого отношения.
|
|||
18
Buster007
17.11.17
✎
13:22
|
а в mysql есть помещение во временную таблицу?
|
|||
19
Брудвар
17.11.17
✎
13:38
|
(18) Конечно
|
|||
20
Buster007
17.11.17
✎
13:44
|
а нельзя поместить в ВТ результат по Селект, а потом сделать update по данным из ВТ? Будет чудо или нет?
|
|||
21
Брудвар
17.11.17
✎
13:51
|
(20) Можно конечно, апдейт будет быстрее работать.
Как это поможет узнать в чем причина ситуации, описанной в (0) |
|||
22
Buster007
17.11.17
✎
14:05
|
(21) у тебя было 2 вопроса "В чем причина? Как оптимизировать?", я на 2ой искал путь )
а на 1ый, чтобы ответить, надо план запроса как минимум посмотреть |
|||
23
Брудвар
17.11.17
✎
14:14
|
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE al ALL NULL NULL NULL NULL 5171 1 SIMPLE e index_merge email,source_id,title_id source_id,title_id 4,4 NULL 16440 Using intersect(source_id,title_id); Using where 1 SIMPLE src eq_ref PRIMARY PRIMARY 452 app_system.e.email 1 Using where |
|||
24
Брудвар
17.11.17
✎
14:16
|
+(23)
Это был UPDATE |
|||
25
Брудвар
17.11.17
✎
14:17
|
Для СЕЛЕКТА все то же самое, кроме последней колонки EXTRA, вторая строка:
Using intersect(source_id,title_id); Using where; Using join buffer (flat, BNL join) |
|||
26
Брудвар
17.11.17
✎
14:19
|
(22) Я хотел узнать способ не как сделать другой запрос, с вложенными, а может есть способ в этом запросе что-то минимально изменить или добавить какую-нибудь дерективу, чтобы он работал так же как СЕЛЕКТ.
|
|||
27
youalex
17.11.17
✎
14:44
|
Можно конечно, в сторону хинтов посмотреть. force order там типа. не знаю, что есть в мускуле
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |