|
|
|
Хранение пользователй в 2-х таблицах
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Прошу помощи в такой задаче. Идея в следующем: Есть 2 таблицы пользователей с одинаковой структурой (активные и неактивные) и 2 таблицы с токенами, также одинаковой структуры, соответственно принадлежащие активным и неактивным пользователям. Все таблицы InnoDB. Пользователей предполагается реально много, поэтому решили разнести их по разным таблицам, чтобы активные пользователи могли комфортно работать без задержек. Если пользователь в течении некоторого времени не проявляет активности, он переносится в таблицу неактивных пользователей, соответственно вместе с токеном. Когда приходит запрос на авторизацию, токен ищется сначала в базе активных токенов. Если он там есть, т.е. пользователь активный, находим его в базе юзеров, все ОК - пользователь быстро включается в работу. Если токен не найден в активных, ищем его в неактивных, если находим, то токен и пользователя нужно оперативно перенести в таблицы активных токенов и юзеров. Вопрос: как это правильно организовать с точки зрения многопоточности и высокой нагрузки? Чтобы в тот момент когда юзер с токеном переносится из одной таблицы в другую, вдруг приходит еще один авторизационный токен от этого юзера. Получится что в активных его ЕЩЕ нет, а в неактивных - УЖЕ нет. На ум приходит только блочить все 4 таблицы. Не получится ли что они будут постоянно заблочены? Использовать транзакции? Как корректно выстроить логику коммитов и ролбэков? Я пока не силен в транзакциях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 09:25:58 |
|
||
|
Хранение пользователй в 2-х таблицах
|
|||
|---|---|---|---|
|
#18+
Oleg8000в активных его ЕЩЕ нет, а в неактивных - УЖЕ нет.Если сначала инсертить запись в таблицу активных, а потом удалять из неаткивных, тогда вроде с логикой все в порядке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 09:42:50 |
|
||
|
Хранение пользователй в 2-х таблицах
|
|||
|---|---|---|---|
|
#18+
Oleg8000Пользователей предполагается реально много, поэтому решили разнести их по разным таблицамИМХО в этом есть смысл только если количество неактивных пользователей на порядки больше чем количество активных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 09:46:06 |
|
||
|
Хранение пользователй в 2-х таблицах
|
|||
|---|---|---|---|
|
#18+
Oleg8000 , выстроив систему ускорения для активных пользователей (не факт, что от неё вообще есть хоть какой-то эффект), Вы накопали себе на пустом месте конкретный геморрой. Причём гарантированно дальше будет всё хуже и хуже... Откажитесь от этой системы и верните одну таблицу на всё про всё - ну нет никакого профита от этого разделения. Если при единой таблице тормоза приводили к некомфортной раобте - то это не проблема количества записей в таблице, и тюнингом сервера можно добиться гораздо большего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 09:50:44 |
|
||
|
Хранение пользователй в 2-х таблицах
|
|||
|---|---|---|---|
|
#18+
Да, приблизительно того же эффекта, как и от деления на две таблицы, можно добиться, если ввести в структуру поле boolActive и выполнить partitioning by range по нему. При наличии where boolActive = const в условии отбора (не в составе комплексного условия!) оптимизатор будет сканровать только нужный раздел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 10:06:52 |
|
||
|
Хранение пользователй в 2-х таблицах
|
|||
|---|---|---|---|
|
#18+
vkleЕсли сначала инсертить запись в таблицу активных, а потом удалять из неаткивных, тогда вроде с логикой все в порядке. Ситуация такая: приходят одновременно 2 запроса от неактивного пользователя: - запрос 1 не нашел активного токена в момент t1, нашел в неактивных токенах в момент t2, начал перенос юзера между таблицами. - запрос 2 не находит активного токена в момент t1, начинает искать в неактивных, но и в неактивных его тоже нет, т.к. запрос 1 успел его уже перенести в активные. vkle ИМХО в этом есть смысл только если количество неактивных пользователей на порядки больше чем количество активных. Именно это и предполагается, что будет очень-очень много неактивных, но которых нежелательно удалять, и которые будут висеть мертвым грузом на активных юзерах. Логика приложения позволяет иметь пользователю по несколько аккаунтов. Akina , почему вы так думаете? Разьве скорость выборки не зависит от кол-ва записей в таблице? Я думаю, что если хорошо отладить это механизм переноса юзеров + поиграть с параметрами, которые влияют на перенос юзера в неактивную таблицу, то можно добиться стабильно хорошего результата на неограниченном кол-ве юзеров в целом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 10:11:30 |
|
||
|
Хранение пользователй в 2-х таблицах
|
|||
|---|---|---|---|
|
#18+
AkinaДа, приблизительно того же эффекта, как и от деления на две таблицы, можно добиться, если ввести в структуру поле boolActive и выполнить partitioning by range по нему. При наличии where boolActive = const в условии отбора (не в составе комплексного условия!) оптимизатор будет сканровать только нужный раздел. Не слышал про partitioning by range . Пошел гуглить.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 10:14:40 |
|
||
|
Хранение пользователй в 2-х таблицах
|
|||
|---|---|---|---|
|
#18+
Oleg8000 Akina , почему вы так думаете? Разьве скорость выборки не зависит от кол-ва записей в таблице?Если количества различаются на порядок и более - да, зависит. Да и то при наличии правильных индексов - несильно. Ну или если объём данных на порядок больше размера оперативки. Oleg8000Не слышал про partitioning by range . Пошел гуглить.. Вернись и больше НИКОГДА не делай этой глупости. Гугл - только после того, как ничего не дал поиск по официальной документации . Но сейчас не тот случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 10:33:06 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38464552&tid=1835724]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 406ms |

| 0 / 0 |
