2010-11-11 2 views
6

Это, вероятно, распространенная ситуация, но я не мог найти конкретного ответа на SO или Google.Поддержание большой таблицы уникальных значений в MySQL

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

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

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

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

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

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

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

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

+0

вопрос, делать и нужно запросить для таблицы 'possiblefriends'? я просто думаю, что вы, вероятно, можете разбить таблицу в соответствии с пользователем, это принесет пользу при запросе u, однако в долгосрочной перспективе это может стать катастрофой технического обслуживания. – ajreal

+0

@ajreal: вы имеете в виду, что у каждого пользователя есть своя таблица? будет около миллиона пользователей или около того, так что это, вероятно, сделает вещи очень сложными. – eric

+0

да, это я упомянул, что это может стать катастрофой технического обслуживания, как насчет использования 1k пользователя за таблицу или так? Представьте себе, что вы поместили все данные в одну таблицу, а стол разбился и был невосстановимым или даже восстанавливаемым, как долго вы можете нести время простоя? – ajreal

ответ

7

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

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

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

Смотрите также:

+1

Я прочитал этот вопрос. Являются ли INSERT IGNORE или INSERT ... ON DUPLICATE KEY UPDATE эффективными для таблицы с 100 миллионами строк в целом? – eric

+1

@eric: Я бы предположил, что «INSERT IGNORE» является самым быстрым, но я просто догадываюсь. Чтобы убедиться, что вы можете выполнить тест производительности для всех трех методов. Самый верный ответ на вопрос, который я связал, рекомендует использовать 'INSERT ... ON DUPLICATE KEY UPDATE'. –

+1

NB - это должен быть уникальный индекс! – symcbean

2

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

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)) 

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

Ваш другой вопрос с массовой вставкой является немного более сложным, вы можете использовать встроенное дублирование функции 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; 
+0

спасибо. всегда лучше использовать индекс? будут ли какие-либо затраты на использование индекса для больших таблиц, которые я должен рассмотреть? – eric

Смежные вопросы