Вход | Регистрация


Информационные технологии :: Администрирование

[MySQL]: Почему UPDATE медленнее чем SELECT?

[MySQL]: Почему UPDATE медленнее чем SELECT?
Я
   Брудвар
 
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
триггеры?
   youalex
 
16 - 17.11.17 - 13:10
скорее всего мимо , но в tsql - функции (UPPER, LEN,  и др и пр) - убивают поиск по индексу.
   Брудвар
 
17 - 17.11.17 - 13:19
Да это все очевидные факты, но к решению проблемы не имеют никакого отношения.
   Buster007
 
18 - 17.11.17 - 13:22
а в mysql есть помещение во временную таблицу?
   Брудвар
 
19 - 17.11.17 - 13:38
(18) Конечно
   Buster007
 
20 - 17.11.17 - 13:44
а нельзя поместить в ВТ результат по Селект, а потом сделать update по данным из ВТ? Будет чудо или нет?
   Брудвар
 
21 - 17.11.17 - 13:51
(20) Можно конечно, апдейт будет быстрее работать.

Как это поможет узнать в чем причина ситуации, описанной в (0)
   Buster007
 
22 - 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) Я хотел узнать способ не как сделать другой запрос, с вложенными, а может есть способ в этом запросе что-то минимально изменить или добавить какую-нибудь дерективу, чтобы он работал так же как СЕЛЕКТ.
   youalex
 
27 - 17.11.17 - 14:44
Можно конечно, в сторону хинтов посмотреть. force order там типа. не знаю, что есть в мускуле


Список тем форума
Рекламное место пустует  Рекламное место пустует
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует