Сортировка рейтинга по триггеру - PullRequest
0 голосов
/ 03 марта 2019

Я создаю игру, в которой игроки будут получать уровни.Основная информация находится в таблице " char " (ник, lvl, exp, money ...).

Я хочу составить рейтинг, который будет регулярно обновляться иработает в режиме реального времени.Я думаю, что нет смысла выполнять операцию «ORDER BY lvl» над таблицей «char» каждый раз, когда кто-то входит на вкладку «Рейтинг» на сайте.

Мой план такой:

1) Создайте дополнительную таблицу: « рейтинг », в которой данные будут физически отсортированы.

2) Создайте триггер , которыйбудет обновлять рейтинг каждый раз, когда кто-то достигает нового уровня или кто-то создает нового персонажа.Это имеет смысл и является более эффективным?

Если так, как я могу это сделать?Если нет, то как еще это сделать?

1 Ответ

0 голосов
/ 03 марта 2019

Почему вы не хотите делать 'ORDER BY char.lvl' каждый раз, когда кто-то посещает страницу "Рейтинг"?Обычно такие операции выполняются в реляционной базе данных.

Денормализация (дублирование данных / индексов по соображениям производительности) - это то, что вы предлагаете.Дублирование релевантных данных в вашей таблице «ранжирования» будет работать, но потребляет больше места.

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

Вы можете создать индекс для столбца lvl, который значительно ускорит запросы для сортировки.(См. https://dev.mysql.com/doc/refman/8.0/en/create-index.html для получения дополнительной информации об индексах).Было бы быстрее обновить вторичный индекс, подобный этому, и потреблять меньше памяти / процессора, чем перестраивать таблицу ранжирования.

Если дополнительный индекс окажется недостаточным, то триггер + дополнительная таблица можеттренировка хорошо ...

Под "физически отсортированным" я полагаю, вы имеете в виду наличие первичного ключа (в отличие от вторичного индекса).Но что будет включать этот ключ?Возможно, lvl + никнейм?Я бы по-прежнему склонялся к индексу на lvl + псевдоним, если бы это было так.

И это вызывает некоторые дополнительные вопросы ... Могут ли пользователи изменить свой ник?Новый уровень также увеличит их опыт?

...