[MySQL] Round-robin выборка строки.

DavyJohnes
На сайте с 05.01.2011
Offline
84
760

Имеется таблица, например, с полями id,name.

Выполняется запрос вида

select * from <table> limit 0,1;

Задача: сделать так что бы строки выдавались по алгоритму round-robin. Т.е. если в таблице 10 строк с id 1..10 то первый запрос должен выдать строку с id=1, второй с id=2 и т.д.

В данный момент это реализовано следующим образом:

В таблицу добавлен еще один столбец: last_access. В скрипте, где происходит выборка, после собственно запроса выполняется еще один запрос который в поле Last_access выбранного логина ставит текущую отметку TIMESTAMP. Таким образом, при выборке строки, вся таблица сортируется по Last_access и в итоге получается требуемый результат.

Проблема в следующем:

Часто параллельно выполняется несколько одинаковых запросов (не точно в одно время, но с небольшой задержкой), и с увеличением нагрузки, т.е. с уменьшением времени между последующими запросами, возникают неполадки, при которых, один скрипт еще не успел записать отметку времени, а следующий скрипт уже запрашивает данные. Очевидно что с ростом нагрузки это может вообще потерять весь смысл.

Так вот хотел бы услышать какие есть варианты ? Думал в сторону триггеров, но ведь нету триггеров на выборку, а только на вставку\изменение\удаление. Как быть?

https://handy-tools.io (https://handy-tools.io) - Набор полезных утилит для всех!
ValdisRu
На сайте с 02.10.2006
Offline
139
#1

как вариант вместо типа MyISAM использовать таблицы типа InnoDB (они поддерживают транзакции и подобных проблем быть не должно)

Обалденный заработок на социальных сетях (https://goo.gl/Qtsq6M)
X
На сайте с 01.10.2012
Offline
8
#2

+1. действительно удивляет, когда приходится встречать требования обеспечения какой-либо целостности данных вместе с myisam и прочими атавизмами )

DavyJohnes
На сайте с 05.01.2011
Offline
84
#3
ValdisRu:
как вариант вместо типа MyISAM использовать таблицы типа InnoDB (они поддерживают транзакции и подобных проблем быть не должно)

И так все таблицы созданы как InnoDB, но о транзакциях никогда не задумывался....погуглю, спасибо.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий