Имя: Пароль:
IT
Админ
[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 там типа. не знаю, что есть в мускуле