Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / UPDATE с LIKE %...% / 18 сообщений из 18, страница 1 из 1
14.11.2013, 10:44:53
    #38464602
hedgehogelez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Приветствую форумчане.
Существуют две таблицы `net` и `dellagent` в одной 160 тыс. записей во второй 50 тыс.
Структура обеих

Цель обновить (UPDATE) в `net` поле chain удалив найденные в нем `dellagent`.`contract`
Использую запрос вида:
Код: plsql
1.
2.
3.
4.
5.
6.
UPDATE `net`, `dellagent`
SET    `net`.`chain` = REPLACE(`net`.`chain`,CONCAT(',',`dellagent`.`contract`,','),''),
         `net`.`generation`=`net`.`generation`-1
WHERE    
         `net`.`depo` != 99992 AND
         `net`.`chain` LIKE CONCAT('%,',`dellagent`.`contract`,',%')


Выполняется на локальной машине уже 45 мин!!!! Просто недопустимо для удаленного сервера, завесит весь ресурс.
Хотя запрос вида:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT 
`net`.`contract`,
`net`.`depo`,
`net`.`chain`,
`dellagent`.`contract`
FROM `net`,`dellagent`
WHERE `net`.`chain` LIKE CONCAT('%,',`dellagent`.`contract`,',%') AND `net`.`depo` != 99992


Занимает всего 2 мин.
Подскажите как победить такой тормоз!
...
Рейтинг: 0 / 0
14.11.2013, 10:57:39
    #38464626
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Попробуй:

1)
Код: sql
1.
`net`.`chain` LIKE CONCAT('%,',`dellagent`.`contract`,',%')


заменить на
Код: sql
1.
INSTR (`net`.`chain`, CONCAT(',',`dellagent`.`contract`,',')) > 0


2) В Update использовать не таблицу dellagent, а подзапрос
Код: sql
1.
SELECT CONCAT(',',`dellagent`.`contract`,',') FROM `dellagent`


3) Что там вообще с индексами? походу их тупо нет...

Итог:

Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE `net`
     , (SELECT CONCAT(',',`dellagent`.`contract`,',') `contract` FROM `dellagent`) `da`
SET    `net`.`chain` = REPLACE(`net`.`chain`,`da`.`contract`,''),
       `net`.`generation`=`net`.`generation`-1
WHERE    
       `net`.`depo` != 99992 AND
       INSTR(`net`.`chain`,`da`.`contract`) > 0
...
Рейтинг: 0 / 0
14.11.2013, 11:13:27
    #38464643
hedgehogelez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Akina,

Спасибо мысль отличная уже пробую. С индексами там все по Фэн-Шую единственное уникальное поле `contract` проиндексировано.
...
Рейтинг: 0 / 0
14.11.2013, 11:15:44
    #38464646
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
hedgehogelezС индексами там все по Фэн-Шую единственное уникальное поле `contract` проиндексировано.
Индексы таблицы dellagent меня совершенно не колышат.
...
Рейтинг: 0 / 0
14.11.2013, 11:25:42
    #38464664
hedgehogelez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Akina,

А если не секрет какой должен колыхать? В выражениях с LIKE %...% MYSQL не использует индексы. Для chain не имеет смысла.
...
Рейтинг: 0 / 0
14.11.2013, 13:39:28
    #38464995
hedgehogelez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Akina,

Запрос выполнен успешно, затронуто записей: 13572 (01:44:25)

Ровно на час дольше первого варианта! Похоже LIKE безнадежен
...
Рейтинг: 0 / 0
14.11.2013, 13:45:36
    #38465008
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Ну да, а соответствие между текстом запроса и временем выполнения нам предлагается установить самостоятельно...
...
Рейтинг: 0 / 0
14.11.2013, 15:02:06
    #38465153
hedgehogelez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
hedgehogelezПриветствую форумчане.
Существуют две таблицы `net` и `dellagent` в одной 160 тыс. записей во второй 50 тыс.
Структура обеих

Цель обновить (UPDATE) в `net` поле chain удалив найденные в нем `dellagent`.`contract`
Использую запрос вида:
Код: plsql
1.
2.
3.
4.
5.
6.
UPDATE `net`, `dellagent`
SET    `net`.`chain` = REPLACE(`net`.`chain`,CONCAT(',',`dellagent`.`contract`,','),''),
         `net`.`generation`=`net`.`generation`-1
WHERE    
         `net`.`depo` != 99992 AND
         `net`.`chain` LIKE CONCAT('%,',`dellagent`.`contract`,',%')


Выполняется на локальной машине уже 45 мин!!!! Просто недопустимо для удаленного сервера, завесит весь ресурс.
Хотя запрос вида:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT 
`net`.`contract`,
`net`.`depo`,
`net`.`chain`,
`dellagent`.`contract`
FROM `net`,`dellagent`
WHERE `net`.`chain` LIKE CONCAT('%,',`dellagent`.`contract`,',%') AND `net`.`depo` != 99992


Занимает всего 2 мин.
Подскажите как победить такой тормоз!


Там слово уже лишнее! :-)
...
Рейтинг: 0 / 0
14.11.2013, 15:05:03
    #38465160
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
160 и 50 тыс., из них 13.5 тыс. под апдейт - и на это час сорок пять? чёта неладно в вашем королевстве...
...
Рейтинг: 0 / 0
14.11.2013, 15:13:09
    #38465176
hedgehogelez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Akina,

Зуб даю! Компьютер G2120@3.10 Ghz 4 Gb
...
Рейтинг: 0 / 0
14.11.2013, 15:15:08
    #38465179
hedgehogelez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Akina,

`net`.`chain` по типу TEXT вот тут то мне кажется и засада.
...
Рейтинг: 0 / 0
14.11.2013, 15:28:28
    #38465210
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
час сорок пять - это блин две записи в секунду апдейтились, сам проверь... ну бред же ж!.
...
Рейтинг: 0 / 0
14.11.2013, 15:29:21
    #38465212
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
hedgehogelez`net`.`chain` по типу TEXTМмм... а на варчар никак не перелицевать?
...
Рейтинг: 0 / 0
14.11.2013, 15:31:40
    #38465215
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Хотя в любом разе это картезианка, я чёта не обратил, что там в отборе НЕравенство.
Наверное, надо уходить от мультизначения в chain, нормализовать. Тогда полетит.
...
Рейтинг: 0 / 0
20.11.2013, 06:10:06
    #38470720
Castlerock
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Вы на "денвере" тестируете? Он по-умолчанию тормоз, если что.
...
Рейтинг: 0 / 0
20.11.2013, 08:20:15
    #38470760
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Если SELECT выполняется за 2 минуты - сохраните его во временную таблицу, а затем соедините ее с обновляемой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create temporary table t_sel
select `ключи`, CONCAT(',',contract,',') as contract
from dellagent where ...;

update
from net
join t_sel using(`ключи`)
set  
  net.chain = REPLACE(net.chain,t_sel.contract,''),
  net.generation=net.generation-1;

drop temporary table t_sel;

Если будет долго выполняться, временную таблицу можно попробовать проиндексировать...
...
Рейтинг: 0 / 0
20.11.2013, 08:23:05
    #38470762
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Хотя 2 иинуты тоже как-то не айс...
...
Рейтинг: 0 / 0
13.12.2013, 11:08:44
    #38499691
hedgehogelez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE с LIKE %...%
Cygapb-007,

ДА, да спасибо. Именно так и решил задачу. Дополнительной таблицей.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / UPDATE с LIKE %...% / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]