|
|
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! Перечитывая в очередной раз мануал, дочитал до конца описание функции LAST_INSERT_ID Оказывается разработчики предусмотрели эмуляцию такой интересной фишки из других SQL-движков, как sequences! Пробовал кто в реальной работе такую эмуляцию? Насколько она работоспособна при мультиюзерной работе? Какие могут быть "подводные камни"? Просто решил сделать в одной из своих баз такой счетчик на простенькой табличке с одним автоинкрементным полем: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Если использовать предложенную разработчиками эмуляцию sequences, то вместо двух операций модификации таблицы получаем всего одну - апдейт единственной ее строки. В принципе, на лицо - ускорение. Но, если апдейт неявно блокирует эту единственную запись, то остальным запросам прийдется подождать?! А в случае с автоинкрементным полем такой блокировки не будет - каждый добавит/удалить свою строку, получив уникальный номер. Как ваше мнение, коллеги - какой из алгоритмов более работоспособный в реальной работе? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 17:00:39 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
OlegROAКакие могут быть "подводные камни"?1) в InnoDB счетчик нигде не хранится и при рестарте MySQL происходит вычисление MAX(id)+1. В результате будут повторы, если все записи удалять. Т.е. лучше удалять WHERE `id` < @id 2) В InnoDB можно получить вечно растущую таблицу. Сейчас подробностей не найду, но был баг в результате которого при INSERT-е данные пишутся всегда в конец. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 17:52:57 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
OlegROAА в случае с автоинкрементным полем такой блокировки не будетНедавно был топик , в котором даже дедлок описывался, а не просто блокировка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 18:01:46 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
miksoftOlegROAА в случае с автоинкрементным полем такой блокировки не будетНедавно был топик , в котором даже дедлок описывался, а не просто блокировка.А при чем здесь эта ссылка?! Ведь мы просто вставляем новую запись, а движек самостоятельно делает инкремент поля. Т.е., мы вообще ничего не блокируем! В этом алгоритме меня смущает необходимость двух операций модификации таблицы - сначала инсерт и после удаление предыдущей записи. Хотя, имхо, на табличке из пары строчек и только с одним полем эти операции будут выполняться очень быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 18:53:01 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
OlegROAА при чем здесь эта ссылка?!Там была схожая ситуация - 15345228 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 18:55:29 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
miksoft1) в InnoDB счетчик нигде не хранится и при рестарте MySQL происходит вычисление MAX(id)+1. В результате будут повторы, если все записи удалять. Т.е. лучше удалять WHERE `id` < @idСпасибо за подсказку - совсем упустил из виду эту особенность автоинкремента для InnoDB! miksoft2) В InnoDB можно получить вечно растущую таблицу. Сейчас подробностей не найду, но был баг в результате которого при INSERT-е данные пишутся всегда в конец.И что? Мы же удаляем не в порядке хранения а по ключу. Т.е. запрос на удаление записей с индексным полем меньше заданного в любом случае должен отработать правильно? Если он косячит, то однозначно проблемы с индексами! А какие проблемы с индексами могут быть у такой маленькой таблички, которая практически всегда будет находиться в кеше?! А что по поводу эмуляции sequences , описанной в доке? Никто не пробовал использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 19:02:25 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
miksoftOlegROAА при чем здесь эта ссылка?!Там была схожая ситуация - 15345228 В чем схожая? Там сначала производился поиск записи с одновременной блокировкой для изменения этой записи. И дедлок происходил, если искомой записи нет, но блокировка уже наложена. И в том случае вообще не использовался автоинкремент. В нашем же случае НИКАКИХ явных блокировок НЕТ! Мы просто добавляем новую запись. И получаем новое значение автоинкрементируемого поля. И удаление старых записей (скорее всего - только одной старой записи) производим тоже без явной блокировки - нам, в принципе, не важен результат удаления - не удалятся старые записи сейчас, удалятся позже - нам они вообще не интересны и удаляем мы их просто что бы эта табличка не росла. Поэтому извините, но я что-то никак не вникну - в чем Вы увидели аналогию между этими двумя совершенно разными, имхо, операциями? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 19:13:18 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
OlegROAmiksoft2) В InnoDB можно получить вечно растущую таблицу. Сейчас подробностей не найду, но был баг в результате которого при INSERT-е данные пишутся всегда в конец.И что?С точки зрения программиста - ничего. Логика работать будет. С точки зрения системного администратора - получим хоть и не быстро, но постоянно растущий файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 19:27:55 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
OlegROAmiksoftпропущено... Там была схожая ситуация - 15345228 В чем схожая?Сорри, наверное, туплю под вечер. Была мысль, но убежала. Видимо был неправ. Хотя у меня все равно осталось некое внутреннее несогласие с отсутствием блокировок, но сформулировать не могу. Возможно, неявно переношу опыт с другой СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 19:31:51 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
OlegROAА что по поводу эмуляции sequences , описанной в доке? Никто не пробовал использовать?На вид технически работоспособно. Но, имхо, будет проблема с блокировками, если не включен автокоммит и если не коммитить сразу после UPDATE-а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 19:39:31 |
|
||
|
Эмуляция sequences в MySql
|
|||
|---|---|---|---|
|
#18+
miksoftС точки зрения системного администратора - получим хоть и не быстро, но постоянно растущий файл.А, Вы в этом смысле! Я просто не понял - думал про то, что записи не будут удаляться и таблица будет расти в плане увеличения количества записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 21:39:52 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38529926&tid=1835381]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
22ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 280ms |

| 0 / 0 |
