Стратегия доступа к данным для сайта, такого как сортированные по SO запросы SQL и одновременные обновления, которые влияют на сортировку?

Я работаю над веб-приложением Grails, которое по шаблонам доступа будет похоже на Stackru или MyLifeIsAverage - пользователи могут голосовать за записи, а их голоса используются для сортировки списка записей по количеству голосов. Голоса могут быть размещены во время выполнения отсортированных запросов выбора.

Так как выборки блокировали бы большую часть таблицы, кажется, что нормальная блокировка транзакций приведет к тому, что обновления будут выполняться вечно (при условии достаточного трафика). Кто-нибудь работал над приложением с такой схемой доступа к данным, и если да, то нашли ли вы способ, чтобы эти обновления и выборки происходили более или менее одновременно? Кто-нибудь знает, как сайты, подобные SO, подходят к этому?

Моей мыслью было сделать отсортированные выборки грязными чтениями, так как это приемлемо, если они не полностью обновляются все время. Это моя единственная идея для возможного улучшения производительности этих выборов и обновлений, но я подумал, что кто-то может знать лучший способ.

1 ответ

Решение

Не делайте слишком много выводов о своей базе данных - базы данных являются чрезвычайно сложными животными и почти всегда НЕ будут работать так, как вы думаете. База данных MVCC, которая является любой современной базой данных (т.е. не таблицами myisam), будет выполнять сканирование таблицы без сильной блокировки. Вся концепция MVCC заключается в том, что записи не блокируют чтения и наоборот. Но сканирование таблицы здесь не будет выполняться. Для эффективного ответа на запрос, вероятно, есть индекс голосов. Этот индекс будет использоваться для 1) ограничения количества строк, извлекаемых из таблицы 2) для извлечения их в отсортированном порядке (т.е. без выполнения сортировки).

Другие вопросы по тегам