update table set .... where id=777 если такой записи c id=777 нет, то insert into table values ('777',.... Как можно одним запросом?
что то вроде этого по моему [sql]IF NOT EXISTS( select) begin insert... end else begin update... end[/sql]
счас так и делаю, но такая конструкция тормозит нужно наоборот сначала апдейтить, а если нет записи, то вставлять
мускул сначала пробует вставить или проверяет duplicate KEY? подозреваю, что сначала пробует вставить, потому и тормозят такие вставки
Не знаю почему у тебя тормозит, мне рекомендовали пару лет назад именно так делать... Может чё не так с базой ?
Не знаю, индексы всякие итд... Что-то слишком подозрительно чтоб такой запрос простой и тормозил... Имеет смысл попробовать также в 2 запроса (это конечно не самое красивое решение, но если оно сработает то почему бы и нет ?)
индексы есть id UNIQUE name INDEX может перед вставкой оставлять индекс только по id ? ON duplicate KEY на какой KEY он смотрит?
Ну норм. а на 300к - долгая вставка это вполне нормальное явление. Особенно когда UNIQUE ключ есть. А задача - этот запрос разово сделать?
inline Сделайте двумя "запросами" - один со всеми INSERT IGNORE, второй - со всеми UPDATE-ами. Вообще, не вижу проблемы, тем более если VDS.
Dagdamor пробовал уже всякими разными способами делов том, что вставка в таблицу загружает проц на 100% почему и как исправить?
inline 1. Конкуррентность (добавляешь, а в то же время другие процессы лезут в таблицу за данными). Решение - LOCK TABLES. 2. Много индексов, и тормозит их обновление. Решение 1 - временно отключать обновление индексов (не помню как), решение 2 - использовать "пакетные" вставки - INSERT INTO ... VALUES (...), (...), (...)...
исключено. создается временная таблица тупо для вставок (потом она переименовывается в робочую) Индексов два уникальный по name (varchar 255) и просто индекс по id буду пробовать решения из второго пункта твоего поста спасибо!