Работа с MySQL в многопотоке

top.razrab

Client
Регистрация
05.09.2017
Сообщения
61
Благодарностей
16
Баллы
8
Работаю стандартным кубиком зенки, с локом таблицы. Получаю примерно 33-40 SELECT и UPDATE к БД в секунду. Как можно увеличить скорость до 300-400 запросов в секунду?
 

Alex733

Client
Регистрация
27.11.2017
Сообщения
316
Благодарностей
230
Баллы
43
Возможно надо смотреть в сторону индексов и составных индексов.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
думай над логикой без локов
 
  • Спасибо
Реакции: bizzon

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 089
Благодарностей
126
Баллы
63

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
если говорить о конкуретном select, то сначала, например, через апдейт изменить спец. поле в строке. А потом уже по этому значению сделать селект
 
  • Спасибо
Реакции: bizzon

top.razrab

Client
Регистрация
05.09.2017
Сообщения
61
Благодарностей
16
Баллы
8
У меня задача, взять из БД свободный аккаунта и изменить его статус. Как без локов обойтись в 100-200 потоков, ну вообще не представляю. Может у кого есть платное решение, напишите в личку!
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 089
Благодарностей
126
Баллы
63
У меня задача, взять из БД свободный аккаунта и изменить его статус. Как без локов обойтись в 100-200 потоков, ну вообще не представляю. Может у кого есть платное решение, напишите в личку!
А вот этот вариант не подойдет?
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 089
Благодарностей
126
Баллы
63
если говорить о конкуретном select, то сначала, например, через апдейт изменить спец. поле в строке. А потом уже по этому значению сделать селект
А если немного подробнее?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
ну есть таблица с полями id, login, password
Добавляем дополнительное поле с именем, например, hash, которое по умолчанию null

Далее хотим взять логин и пароль, которые не взял другой поток. Для этого генерируем криптостойкую случайную строку. C# метод Path.GetRandomFileName подойдет.
Делаем апдейт вида
UPDATE таблица SET hash='наша_рандомная_строка' WHERE hash IS NULL LIMIT 1;
Т.е. мы помечаем одну строку, где хэш пустой.
Теперь мы можем без проблем сделать селект к этой строке через хэш, который мы сами сгенерировали и ни один другой поток эту строку не возьмет.
Важно не забыть занулить хэш после отработки строки.

Потенциальные проблемы у этого метода - по какой-то причине не занулить строку после отработки как итог - строка зависнит в "рабочих" навсегда, пока вручную не подправить. Решение - усложнить запросы, добавив в таблицу дополнительное поле, отвечающее за время, когда строка будет свободна вне зависимости от того, null в поле или нет
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)