Ведение большой таблицы уникальных значений в MySQL - PullRequest
6 голосов
/ 11 ноября 2010

Это, вероятно, распространенная ситуация, но я не смог найти конкретный ответ в SO или Google.

У меня есть большая таблица (> 10 миллионов строк) отношений друзей в базе данных MySQL, котораяочень важно и должно поддерживаться таким образом, чтобы не было повторяющихся строк.В таблице хранятся пользовательские идентификаторы.SQL для таблицы:

CREATE TABLE possiblefriends(
 id INT NOT NULL AUTO_INCREMENT, 
 PRIMARY KEY(id),
 user INT, 
 possiblefriend INT)

Таблица работает так, что у каждого пользователя есть около 1000 или около того «возможных друзей», которые обнаружены и должны быть сохранены, но дублирование «возможных друзей» необходимоследует избегать.

Проблема заключается в том, что из-за дизайна программы в течение дня мне нужно добавить в таблицу 1 миллион или более строк, которые могут быть или не быть повторяющимися записями строк.Казалось бы, простой ответ - проверить каждую строку, чтобы увидеть, является ли она дубликатом, а если нет, то вставить ее в таблицу.Но этот метод, вероятно, станет очень медленным, так как размер таблицы увеличится до 100 миллионов строк, 1 миллиарда строк или выше (что я ожидаю в ближайшее время).

Какой самый лучший (то есть самый быстрый) способсохранить эту уникальную таблицу?

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

Если нет, каков наилучший способ для этой таблицы в долгосрочной перспективе?

(Если индексы являются наилучшим долгосрочным решением, скажите, пожалуйста, какие индексы использовать)

Ответы [ 2 ]

7 голосов
/ 11 ноября 2010

Добавьте уникальный индекс на (user, possiblefriend), затем используйте одно из:

, чтобы избежать ошибок при попытке вставить дублирующую строку.

Вы также можетеЯ хочу рассмотреть вопрос о том, можете ли вы удалить свой автоматически увеличивающийся первичный ключ и использовать (user, possiblefriend) в качестве первичного ключа.Это уменьшит размер вашей таблицы, а также первичный ключ будет функционировать как индекс, избавляя вас от необходимости создавать дополнительный индекс.

См. Также:

2 голосов
/ 11 ноября 2010

Уникальный индекс позволит вам быть уверенным, что поле действительно уникально, вы можете добавить уникальный индекс, например, так:

CREATE TABLE possiblefriends( 
 id INT NOT NULL AUTO_INCREMENT,  
 PRIMARY KEY(id), 
 user INT,  
 possiblefriend INT,
PRIMARY KEY (id),
UNIQUE INDEX DefUserID_UNIQUE (user ASC, possiblefriend ASC))

Это также значительно ускорит доступ к вашему столу.

Другая проблема с массовой вставкой немного сложнее, вы можете использовать встроенную функцию ON DUPLICATE KEY UPDATE ниже:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;
...