- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Судя по структуре, в таблице t1 нет поля item_id,
Да, да, я уже заметил. Исправил выше, но вы опередили
Правильный запрос:
update t1 set max_price=(select max(price) from t2 where id=t1.id)
Попробуйте
бэкап на всякий случай..
но не поддерживает group by.
UPDATE t1 INNER JOIN (SELECT MIN(price) as min_price, MAX(price) as max_price, id FROM t2 GROUP BY id) z ON t1.id=z.id SET t1.`min`=z.min_price, t1.`max`=z.max_price
Заинтересовал сабж.
Тоже придумал вариант. Селекта хоть и два, но второй ищет по таблице из одной строки и нет Group by.
Смысл в том, что во время подзапроса сохраняем второе нужное нам значение в переменную и дальше её используем.
Селекта хоть и два, но второй ищет по таблице из одной строки и нет Group by.
Хз, но мне так и не удалось запустить этот запрос.
Если там два селекта, проще уже будет написать так
Итак..
Таблица в 150к.
Вариант с двумя селектами работает по 4.2сек на каждый селект (т.е. около 8 суммарно)
Вариант siv1987 с update с join 5.57 сек
Вариант ivan-lev с replace самый долгий - 11.74 сек, что не удивительно - он делает DELETE+INSERT. К тому же с ним возникает, в принципе, решаемая проблема в несоответсвии колонок (в реальной таблице есть дополнительные)
Вариант doctorpc не работает, так как во втором вложении ему неоткуда знать о первой таблице: Unknown column t1.id in 'where clause', поэтому его протестировать не удалось.
Однако кое-что новое из этого всего вынес. Спасибо
Вариант siv1987 с update с join 5.57 сек
Вариант ivan-lev с replace самый долгий - 11.74 сек, что не удивительно - он делает DELETE+INSERT. К тому же с ним возникает, в принципе, решаемая проблема в несоответсвии колонок (в реальной таблице есть дополнительные)
Индекс хотябы на t2.t1_id есть? А в идеале для быстрого запроса t1_id (t1_id, price). Хотя если это операция которая запускается раз в субботу каждого третьего месяца високосного года, то не так уж и плохо. Нет смысла гнаться за бешеной скоростью там где это не нужно в ущерб другого.
Индекс хотябы на t2.t1_id есть?
Да, индексы, конечно, есть. Скорость устраивает, обновляется не часто.
Было бы, конечно, хорошо убрать избыточность совсем, но получается долго..
Работает тем дольше, чем больше offset, и на конец таблицы (offset 150000) выполняется 1.28 сек, когда как в начале моментально. Может, это можно побороть?
ID - первичный, уникальный ключ в t1 и простой ключ в t2
Ради интереса покажите структуру индексов
Ради интереса покажите структуру индексов
Таблицы InnoDB, т.к. лочить всю таблицу на время обновления непозволительно...
show indexes from t1\G
*************************** 1. row ***************************
Table: t1
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: item_id
Collation: A
Cardinality: 105688
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
show indexes from t2\G
*************************** 1. row ***************************
Table: t2
Non_unique: 1
Key_name: item_id
Seq_in_index: 1
Column_name: item_id
Collation: A
Cardinality: 111414
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE