|
|
|
Множественные запросы в секунду
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, уже 3-й день не могу придумать алгоритм решения. Имеется БД, в ней таблица, в таблице несколько десятков тысяч строк. Каждую секунду к таблице обращаются клиенты, например 50 штук в секунду. Основная суть их запроса - SELECT нескольких строк. Но каждому клиенту нужно отдавать уникальные строки. Например клиенту 1 - с 1 по 5, клиенту 2 - с 6 по 7, следующему клиенту - следующих 5 и тд. Простыми словами приложение говорит базе - дай мне несколько строк. (К слову, все эти строки из базы я локально закешировал у каждого клиента, чтоб ускорить работу). Все что мне пришло в голову - хранить в таблице в 0-м рядке индекс строки, которую я отдал в последний раз. Например я отдал 1000-ю строку. Когда очередной клиент подключается к базе, он вычитывает этот индекс, и увеличивает (UPDATE) его например на 5, т.к ему нужно 5 срок. А себе из локального хранилища уже берет строки с 1000 по 1005, получив разрешение. Проблема в том, что в момент времени, когда клиент вычитал из 0-го рядка индекс, и следующей командой сделает UPDATE, другой клиент может УЖЕ перезаписать 0-й рядок таблицы своим значением. Для этого я думал использовать команду "SELECT… FOR UPDATE", которая блокирует считываемые строки на чтение. Я посчитал, что на 2 эти запроса (SELECT и UPDATE) в моем приложении уходит около 100 миллисекунд. А у меня 50 запросов в секунду, я боюсь что выстроится большая очередь, приложения начнут тупить и подвисать, пока получат ответ от базы. Возможно знающие люди подскажут алгоритм или паттерн, по какому следует решать такого рода задачи? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 16:38 |
|
||
|
Множественные запросы в секунду
|
|||
|---|---|---|---|
|
#18+
trojanserver, Сама по себе таблица статичная, не изменяется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 16:57 |
|
||
|
Множественные запросы в секунду
|
|||
|---|---|---|---|
|
#18+
miksoft, Изменяется 1 раз в пару дней, полностью. Все клиенты получают новую копию данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 17:47 |
|
||
|
Множественные запросы в секунду
|
|||
|---|---|---|---|
|
#18+
Вариант. Введи поле ID_Client. Для начала там Null. Клиент просто пытается зарезервировать себе запись, вписав в это поле свой ID: Код: sql 1. 2. 3. 4. 5. Affected rows = 1? обрабатывай. Affected rows = 0, кто-то влез до тебя? пробуй зарезервировать другую запись. Как вариант, не задавать ID, но задать LIMIT 1. А потом смотреть, какая запись зарезервировалась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2016, 17:51 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39172446&tid=1832143]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
200ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 540ms |

| 0 / 0 |
