|
|
|
| В таблицу добавляются записи с помощью оператора INSERT… ON DUPLICATE KEY UPDATE.
Для осуществления этой операции сразу после создания таблицы выполняется запрос типа ALTER TABLE kattov ADD UNIQUE (producer, artikul, name_tov).
Таким образом обеспечивается достаточно высокое быстродействие и два миллиона записей формируются за вполне приемлемое время.
Вместе с тем возникает необходимость добавления записей оператором INSERT… ON DUPLICATE KEY UPDATE, уникальных по полю GUID, для которых уникальность по комбинации полей producer, artikul, name_tov снимается.
Как это осуществить?
Можно ли выполнить ALTER TABLE kattov ADD UNIQUE (GUID) и потом использовать INSERT… ON DUPLICATE KEY UPDATE?
А при необходимости вновь выполнить ALTER TABLE kattov ADD UNIQUE (producer, artikul, name_tov) и вернуться к уникальности по этим полям?
Приемлема ли эта методика смены уникальности к таблице, содержащей несколько миллионов записей, или это слишком ресурсоемко и будет занимать очень большое время? | |
|
|
|
|
|
|
|
для: Владимир55
(06.01.2013 в 21:52)
| | А как часто эта операция будет осуществляться? Вообще когда речь заходит о 2 миллионах или большем количестве записей (причем именно на вставку/модификацию/удаление, а не на выборку), становится приемлемым практически все, что хоть как-то ускорит процесс. Вообще можно же не удалять индексы, а просто временно их отключить на момент вставки
ALTER TABLE kattov DISABLE KEYS;
|
потом, когда вставка записей будет произведена, можно включить индексы обратно
ALTER TABLE kattov ENABLE KEYS;
|
Это особенно удобно, когда у вас много индексов. | |
|
|
|
|
|
|
|
для: cheops
(06.01.2013 в 22:49)
| | "А как часто эта операция будет осуществляться?"
При самом напряженном варианте 1 раз в час, а в среднем еще реже.
Как я понял Вашу идею, можно первоначально сделанный индекс отключить и обрабатывать таблицу как угодно, а потом индекс включить.
Верно?
Однако вставку тоже хотелось бы осуществлять с помощью INSERT… ON DUPLICATE KEY UPDATE, поскольку добавляется порядка ста тысяч записей и одновременно происходит обновление уже имеющихся. То есть, лучше всего как-бы иметь два индекса (по двум группам полей), и один из них использовать в одном режиме вставки, а другой использовать в другом режиме.
Это осуществимо?
Можно ли индексы отключить ALTER TABLE kattov DISABLE KEYS и тут же, при отключенных индексах, выполнить другую индексацию ALTER TABLE kattov ADD UNIQUE (GUID)?
Потом опять отключить индексы ALTER TABLE kattov DISABLE KEYS и вновь выполнить первоначальную индексацию ALTER TABLE kattov ADD UNIQUE (producer, artikul, name_tov).
Или это так не делается? Или это делается, но не так?
А вообще, может ли у таблицы быть несколько UNIQUE? Как бы поточнее понять существо этого дела... В сети об этом много, но как-то путанно. | |
|
|
|
|
|
|
|
для: Владимир55
(07.01.2013 в 00:09)
| | Несколько UNIQUE быть может.
НО!
Если вы отключите индекс по первым трем полям и добавите неуникальные по этим полям записи, то либо индекс не включится обратно, либо сразу не позволит добавить их. В любом случае это не должно прокатить, т.к. нельзя создать уникальный индекс по неуникальным записям.
Хотя я не проверял. | |
|
|
|