Обновление поля данными той же строки

Aqvatarius

Новичок
Доброго времени суток.
Есть таблица mysql, 5 500 000 строк.

приблезительно такая структура

id, name, name2, marge

поле айди индекс,
name, name2 - varchar
marge - пустое поле

Задача: обьединить значения name, name2 через пробел(например), в поле marge.
Как с такими обьемами данных это сделать?

Можно ли написать sql запрос? или нужно использовать скрипт?
Пока знаний хватило на то что бы использовать скрипт. Как ускорить процесс?
 

Aqvatarius

Новичок
Ну, что конкат это и так понятно...
Я видимо не верно описал задачу...

id | name | name2 | marge
1 | aaaa | bbbbb | NULL
2 | aaaa | bbbbb | NULL
3 | aaaa | bbbbb | NULL
... и записей таких 5,5 миллиона.
Нужно пройтись по каждому полю, и обьединив данные ячеек name+name2 записать их в marge
Результат:
id | name | name2 | marge
1 | aaaa | bbbbb | aaaa bbbbb
2 | aaaa | bbbbb | aaaa bbbbb
3 | aaaa | bbbbb | aaaa bbbbb
 

Aqvatarius

Новичок
Спасибо...

Пы.Сы.: вот как оно бывает... среди ночи начнешь что то делать, в голову лезет все, кроме простого...
 

Aqvatarius

Новичок
Еще один вопрос...
Часть данных уже обьеденена. Правильно ли будет написать запрос так?

UPDATE table SET marge = CONCAT_WS(' ', name, name2) where marge='NULL';

Повлияет ли это на скорость обработки? или лучше что бы оно еще раз по всем полям пробежалось?

Ну и 5.5кк полей это не мало, как лучше всего в такой ситуации облегчить нагрузку?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Не правильно ты написал запрос, как мне кажется. NULL - не строковый тип.
 

Aqvatarius

Новичок
UPDATE table SET marge = CONCAT_WS(' ', name, name2) where marge='';
UPDATE table SET marge = CONCAT_WS(' ', name, name2) where marge IS NULL;
 

Aqvatarius

Новичок
Что б не создавать новую тему, задам вопрос сдесь.

Соответсвенно есть таблица 5.5кк строк - `dbb`
В ней есть поле `marge` (tinytext) - в данном поле текст, в коем встречаются название стран.
В данной таблице (dbb) существует поле `country`((int)NULL)
Есть еще одна таблица с странами (countries),
`id`,`name_en`,`name_ru`,`name_ua`
240 записей...
Нужно пробежатся по полях `marge` найти значения '%`name_ua`%' ну и в случае находки записать `countries`.`id` в `bdd`.`country`:
Возможно ли это реализовать SQL запросом без вмешательства скрипта?
Сейчас есть так

UPDATE `bdd`
SET `bdd`.`country` = (SELECT `countries`.`id` FROM `countries` WHERE `bdd`.`marge` LIKE CONCAT('%',`countries`.`name_ua`,'%') AND `countries`.`id`='1')

Дайте совет пожалуйста.
 

Aqvatarius

Новичок
Но данный запрос работает очень медленно, даже с условием `countries`.`id`='1'...
Выходит мне нужно писать скрипт что будет пробегать по всем странам, брать id и будет по очереди выполнять этот запрос...
Но, по времени выполнения, он загнется на первом же запросе... как быть?
 

Aqvatarius

Новичок
Ну где же эти светлые головы(!!!) что обсирают в других темах программистов, и показывают свое превосходство?!
 

zerkms

TDD infected
Команда форума
Aqvatarius
Не самая лучшая стратегия привлечения внимания.

WHERE `bdd`.`marge` LIKE CONCAT('%',`countries`.`name_ua`,'%') === фуллскан. улучшить - через фуллтекстовый поиск.

следующий.
 

Aqvatarius

Новичок
улучшить - через фуллтекстовый поиск.
Подробнее, будьте добры.

Не самая лучшая стратегия привлечения внимания.
Как видите работает. И печально что Ваше внимание я привлек именно таким методом.

Спасибо.
 

zerkms

TDD infected
Команда форума
Aqvatarius
Лично мне просто эта тема неинтересна. Задача судя по всему разовая. В чём смысл оптимизировать тут - я не вижу. Сделал один раз, подождал 20 минут, всё. Забыл.
 

Aqvatarius

Новичок
Проблема в том что не 20 минутная работа... а один запрос вида
PHP:
UPDATE `bdd`
SET `bdd`.`country` = (SELECT `countries`.`id` FROM `countries` WHERE `bdd`.`marge` LIKE CONCAT('%',`countries`.`name_ua`,'%') AND `countries`.`id`='1')
занимает 10-15 минут...
 

zerkms

TDD infected
Команда форума
Тогда можно в отдельную таблицу сначала собрать все `bdd`.`marge` LIKE CONCAT('%',`countries`.`name_ua`,'%'), без дополнительных условий, а потом уже обновлять, имея уже подготовленные данные, по которым индекс быстро сработает
 
Сверху