Я тут умища набрался, исходники почитав 😃 . Вот есть куча ньюсгрупп. В каждой свой индекс сообщений, который должен постоянно расти, причем без “дырок”
Если группа одна - все просто. Вешаем автоинкрементный индекс и не паримся. Если групп много - ну не хранить же каждую в отдельной таблице. Или если счетчики с номерами последних сообщений хранить отдельно - надо обеспечивать атомарность апдейтов. А это либо транзакции, либо херомантия с процедурами и триггерами. Бяка!
Оказалось, что давно есть относительно простое решение - можно автоинкрементный индекс навесить не на одну колонку, а сразу на две (id сообщения и id группы). Тогда все растет правильно. Почти. Нюанс в том, что если стереть последнее сообщение в группе, то новое будет добавлено с тем же id. Составной автоинкремент, в отличие от обычного, последний “использованный” ID для каждой группы (после удаления строки) хранить не умеет. То есть, пока ничего не удаляем - все хорошо. А если удаляем последнее сообщение в группе - нумерация слетает.
Выход оказался тривиальным - строки не удалять, а только помечать как удаленные. Вроде все пашет. И главное - простой код .
{"assets_hash":"a8b26fa7f6e768b07a72c8c9aadb9422","page_data":{"users":{"39c21abc3df9550077797d18":{"_id":"39c21abc3df9550077797d18","hid":349,"name":"Vitaly","nick":"Vitaly","avatar_id":null,"css":""}},"settings":{"blogs_can_create":false,"blogs_mod_can_delete":false,"blogs_mod_can_hard_delete":false,"blogs_mod_can_add_infractions":false,"can_report_abuse":false,"can_vote":false,"can_see_ip":false,"blogs_edit_comments_max_time":30,"blogs_show_ignored":false,"blogs_reply_old_comment_threshold":30,"votes_add_max_time":168},"entry":{"_id":"4a89b4ec99707300770fa60a","hid":7184,"title":"Составной автоинкрементный индекс в mysql","html":"<p>Я тут умища набрался, исходники почитав <span class=\"emoji emoji-smiley\" data-nd-emoji-src=\":smiley:\">😃</span> . Вот есть куча ньюсгрупп. В каждой свой индекс сообщений, который должен постоянно расти, причем без “дырок”</p>\n<p>Если группа одна - все просто. Вешаем автоинкрементный индекс и не паримся. Если групп много - ну не хранить же каждую в отдельной таблице. Или если счетчики с номерами последних сообщений хранить отдельно - надо обеспечивать атомарность апдейтов. А это либо транзакции, либо херомантия с процедурами и триггерами. Бяка!</p>\n<p>Оказалось, что давно есть относительно простое решение - можно автоинкрементный индекс навесить не на одну колонку, а сразу на две (id сообщения и id группы). Тогда все растет правильно. Почти. Нюанс в том, что если стереть последнее сообщение в группе, то новое будет добавлено с тем же id. Составной автоинкремент, в отличие от обычного, последний “использованный” ID для каждой группы (после удаления строки) хранить не умеет. То есть, пока ничего не удаляем - все хорошо. А если удаляем последнее сообщение в группе - нумерация слетает.</p>\n<p>Выход оказался тривиальным - строки не удалять, а только помечать как удаленные. Вроде все пашет. И главное - простой код .</p>\n","user":"39c21abc3df9550077797d18","ts":"2009-08-17T19:52:12.000Z","st":1,"cache":{"comment_count":0},"views":1119,"bookmarks":0,"votes":0},"subscription":null},"locale":"en-US","user_id":"000000000000000000000000","user_hid":0,"user_name":"","user_nick":"","user_avatar":null,"is_member":false,"settings":{"can_access_acp":false,"can_use_dialogs":false,"hide_heavy_content":false},"unread_dialogs":false,"footer":{"rules":{"to":"common.rules"},"contacts":{"to":"rco-nodeca.contacts"}},"navbar":{"tracker":{"to":"users.tracker","autoselect":false,"priority":10},"forum":{"to":"forum.index"},"blogs":{"to":"blogs.index"},"clubs":{"to":"clubs.index"},"market":{"to":"market.index.buy"}},"recaptcha":{"public_key":"6LcyTs0dAAAAADW_1wxPfl0IHuXxBG7vMSSX26Z4"},"layout":"common.layout"}