alexey980
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору есть простая, но очень длинная таблица users с одним поле id. время от времени нужно добавлять в таблицу пачками новые id, но чтобы при это дубликаты не добавлялись, и выводить результат, то есть только те id, которые были добавлены при выполнении последнего запроса. например, исходная таблица: ааа bbb добавляем список: aaa, xxx, bbb, yyy конечная таблица: aaa bbb xxx yyy на выходе: xxx, yyy пока я пришел к двум вариантам решения задачи. вариант 1: в исходной таблице заводим 2 поля Num (INT, PRIMARY KEY, AUTO_INCREMENT) и id (VARCHAR, UNIQUE). тогда типовая операция будет включать следующие запросы: шаг А. вычисляем номер последней записи таблицы и запоминаем результат в $Num_MAX SELECT MAX(Num) FROM users шаг B. добавляем в таблицу новые id (дубликаты игнорируем) INSERT IGNORE INTO users(id) VALUES('aaa'),('bbb'),('xxx'),... шаг C. делаем выборку только тех id, которые были добавлены в ходе предыдущего запроса SELECT id FROM users WHERE Num > $Num_MAX вариант 2: оставляем в таблице одно поле id, уже без всяких индексов. тогда перед добавлением новых id: aaa, bbb, xxx... делаем предварительную выборку из таблицы вроде SELECT * FROM users WHERE id IN ('aaa', 'bbb', 'xxx', …) сравнивая эту выборку с входящим списком новых id, удаляем из него дубликаты. (здесь можно средствами php усечь входящий запрос или регулярными выражениями обойтись) и затем уже этот усеченный список вставляем в таблицу с помощью обычного INSERT без всяких игноров INSERT INTO users(id) VALUES('xxx'),('yyy'),… вопрос знатокам: что будет работать быстрее, если в таблице 2 миллиона id, а добавлять по запросу нужно по 2000 новых id за раз, но чтобы при этом дубликаты не добавлялись. в первом случае таблица индексная, во втором без индекса. индекс же будет тормозить вставку? можно ли как-то еще оптимизировать запросы для решения этой задачи? важна исключительно скорость выполнения запросов. | Всего записей: 96 | Зарегистр. 27-01-2007 | Отправлено: 19:23 30-03-2013 | Исправлено: alexey980, 19:29 30-03-2013 |
|