UPDATE vs DELETE/INSERT

xbs

Новичок
UPDATE vs DELETE/INSERT

Сохраняю сессионные переменные в базу, вижу 2 способа, встал вопрос, какой из них быстрее.
1) способ:
- обновить значения переменных: UPDATE table SET varvalue='$value', timestamp=NOW() WHERE varname='$name';
- проверить были ли затронуты строки обновлением: if (mysql_affected_rows() == 0) если нет, то
- вставить значение переменной: INSERT INTO table SET varvalue='$value', varname='$name', timestamp=NOW();

В данном случае timestamp необходимо использовать, чтобы mysql_affected_rows возвращало число затронутых строк больше 0, когда обновляемое varvalue не отличается от уже установленного.

Т.к. переменные в сессии находятся до ее окончания, то в течении жизни сессии INSERT для каждой переменной будет осуществлено только однажды

2) способ:
- удалить строку со старым значением переменной: DELETE FROM table WHERE varname='$name';
- вставить значение переменной: INSERT INTO table SET varvalue='$value', varname='$name';

timestamp, в данном случае, не нужен, но постоянно происходит удаление-вставка.

Грубо говоря, вопрос стоит в том, что быстрее UPDATE или DELETE-INSERT?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
a. протестировать
b. отложенные insert, update

-~{}~ 19.12.07 16:11:

- проверить были ли затронуты строки обновлением:
А не проще тогдауж replace?
 

xbs

Новичок
replace заменяет строки по первичному ключу или индексу, здесь же замена идет по имени сессионой переменной и идентификатору сессии. имена переменных будут повторяться для разных сессий. да и индексация достаточно ресурсоёмкий процесс в этом случае, мне кажется
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
xbs
Хорошо
а. что такое
сессионные переменные в базу
б.что должен сохранять Ваш запрос.

да и индексация достаточно ресурсоёмкий процесс в этом случае, мне кажется
В любом случае "пачкой" будет быстрее.
Как UPDATE так и DELETE+INSERT

-~{}~ 19.12.07 16:40:

Для "убыстрения" удаления поекпериментируйте с размером кеша индексов
 

xbs

Новичок
это любые переменные сессии, они сохраняются в базе данных, а не в файле, как бывает, когда используется стандартный механизм сессий PHP.

в моем варианте, "пачкой" не представится случай
 

Gas

может по одной?
xbs
не понятно почему replace не устраивает, session_id как раз и должен быть уникальным ключём.

Имхо, но если сравнивать для сессий UPDATE vs DELETE/INSERT (myisam), то update должен быть лучше за счёт того, что не создаются "дыры" в таблице и нормально должны работать конкурентные инсерты.
 

HraKK

Мудак
Команда форума
А поискать по инету не думали? Посмотреть как это делают другие?
 

xbs

Новичок
Gas, фрагментация таблицы будет происходить в любом случае постоянно. Т.к. пользователей много и соответственно сессии будут создаваться, удаляться постоянно.
Session_id будет уникальным ключем в таблице описывающей сессию, меня же интересует работа со второй таблицей, куда будут записываться переменные сессии, каждой переменной по строчке. Повторюсь, в ней переменные выбираются по имени и идентификатору сессии. Индексируя эти 2 поля, мы получим больше вреда, чем пользы, мне так кажется.

HraKK, я искал, но не нашел ничего дельного. Искал, возможно, плохо и невнимательно, потому что предполагаю, что этот вопрос должен быть популярен и известен
 

Gas

может по одной?
xbs
все реализации которые я видел - были с одной таблицей, все данные сессии хранились в одном поле в сериализованном виде. Зачем делать 2 таблицы для этого случая не вижу смысла.
Что касается фрагментации - чистить таблицу сессий слишком часто особо тоже не стоит - раз в сутки/двое cron'oм запускать скрипт по очистке и optimize table, вот и нет фрагментации.

А как искал? Так?
 

fixxxer

К.О.
Партнер клуба
можно глупый вопрос? спасибо.

нахрена хранить в базе, если волнует скорость?
 

Gas

может по одной?
fixxxer
тоже верно, возможно от незнания альтернатив.
 

xbs

Новичок
Gas, есть необходимость выбора сессий по некоторым переменным и их определенным значениям, что в случае с сохранением всех переменных в одном поле не удобно и медленно, а выделять для каждой переменной свой столбец в таблице сессии, тоже накладно и не гибко.
Для этой задачи очень хорошо подходит описанный мной вариант со второй таблицей, где хранятся переменные сессии.

flixxxer, разве для решения поставленной задачи есть более производительный способ, чем хранить в базе?

Всё же хочется возвратиться к фундаментальному вопросу, что быстрее UPDATE или связка DELETE/INSERT? Сталкиватся с этим вопросом программисты должны были и необязательно в задачах связанных с сессиями.
 

fixxxer

К.О.
Партнер клуба
признаться, сложно придумать способ, который будет медленнее. :)
 

xbs

Новичок
fixxxer, признаться, мне кажется, ты лукавишь. иначе не томи душу
 

fixxxer

К.О.
Партнер клуба
чем стандартный способ хранения сессий в flat-файлах в сериализованном виде не устроил?

писать ваще ничего не надо, работать будет уж точно быстрее твоих поделок
 

Фанат

oncle terrible
Команда форума
xbs
что мешает тебе писать в базу только нужную тебе информацию "по определенным значениям", а сессии остаить в покое?
 

xbs

Новичок
fixxxer, необходимо отслеживать пользователей онлайн и управлять ими, например, должна быть возможность отключить пользователя и его сессию.

Фaнaт, так оно и есть, я и говорю, что сессии тут вторичны и мой вопрос не особо сильно затрагивают.

я подумал так, раз в обоих случаях присутствует выборка по условию (1)update... where условие, 2) delete ... where условие), но во 2ом случае добавляется еще Insert, то 1-ый вариант предпочтительней
 
Сверху