лучшая практика для поддержания рейтинговых таблиц? - PullRequest
1 голос
/ 19 сентября 2010

Используя MySQL и PHP, у меня есть простая таблица ранжирования с 2 столбцами user и score.

Раз в неделю я повторно запускаю скрипт ранжирования, и он вычисляет баллы для каждого пользователя.

  • у многих пользователей новые оценки
  • у некоторых нет
  • иногда появляются новые пользователи для добавления в таблицу

Чтолучший способ подойти к этому с MySQL?update работает, если мне нужно добавить новые строки?insert переопределит существующие строки, чтобы я мог просто вставить всю таблицу снова?Было бы лучше просто оставить таблицу и переписать ее с нуля?

**Sample Data**

User01   2500
User02   3000
User03    100

**New Data to be Added**

User01   2700
User02   4000
User04   1000 // new account

За исключением тысяч пользователей ...

Ответы [ 3 ]

1 голос
/ 19 сентября 2010

Синтаксис REPLACE ... INTO будет вставлять новые строки при необходимости и удалять + вставлять для существующих строк:

# deletes existing and inserts new row:
REPLACE INTO users SET score = 2000, username = 'User01';
# deletes existing and inserts new row
REPLACE INTO users SET score = 3000, username = 'User02';
# inserts new row
REPLACE INTO users SET score = 4000, username = 'User04';  

http://dev.mysql.com/doc/refman/5.0/en/replace.html

Мой любимый метод - использовать ON DUPLICATE KEY синтаксис - в основном потому, что я всегда предполагал, что удаление строки с последующей ее вставкой будет более «дорогим», чем просто обновление существующей строки.Предполагая, что поле username является индексом UNIQUE или PRIMARY KEY, вы можете сделать следующее:

# Updates existing User01 row
INSERT INTO users SET score = 2000, username = 'User01' ON DUPLICATE KEY UPDATE score = 2000;
# Updates existing User02 row
INSERT INTO users SET score = 3000, username = 'User02' ON DUPLICATE KEY UPDATE score = 2000;
# Inserts new User04 row
INSERT INTO users SET score = 4000, username = 'User04' ON DUPLICATE KEY UPDATE score = 2000;

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

0 голосов
/ 19 сентября 2010

Как вы упомянули в двух направлениях

ОБНОВЛЕНИЕ ИЛИ ВСТАВКА

Я думаю, что INSERT будет лучше, чем обновление. Для вставки вы добавляете один запрос. Где для обновления вы должны запустить 2 запроса для каждого пользователя. сначала выберите пользователя, а затем обновите его на основе идентификатора пользователя.

Таким образом, быстрее всего будет вставлено, и вы можете суммировать его в любое время, используя SQL запрос.

0 голосов
/ 19 сентября 2010

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

Удаление и перезапись всей таблицы кажется приемлемым решением, если большинству пользователей требуется обновление, и есть пользователи, которых следует удалить, т. Е. Больше не содержать в новых таблицах оценок.

В противном случае я бы обновил таблицу:

Переносимое решение состоит в том, чтобы проверить, содержится ли ключ (то есть пользователь) в таблице (через SELECT), и затем использовать либо INSERT для несуществующих ключей, либо UPDATE для уже существующих ключей. Конечно, вы также можете просто попробовать INSERT и проверить код ошибки, возвращаясь к UPDATE, если вы получили ошибку нарушения ограничения.

В MySQL вы также можете использовать следующий синтаксис, который позволяет вам работать только с одним запросом:

INSERT INTO ... ON DUPLICATE KEY UPDATE score = ...

Однако это не переносимо и не будет работать с другими СУБД, только с MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...