Я пытаюсь найти наиболее эффективный код для поиска дубликатов имен файлов в родительской папке. Я хранения дерева файлов в базе данных MySQL, используя родитель-потомок модели с родословной:Уникальное имя файла в дереве каталогов MySQL
CREATE TABLE `filetable` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`parent_id` int(11) NOT NULL,
`path_num` varchar(255) NOT NULL,
`path_string` text() NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Я рассматриваю два метода:
1. Запустите запрос:
INSERT INTO filetable (name, parent_id, path_num, path_string)
SELECT '$name','$pid','$path_num','$path_string' FROM DUAL
WHERE NOT EXISTS
(SELECT name FROM filetable WHERE name='$name');
и в PHP :
if (mysql_affected_rows() === 0) takeAction($name);
ПРОФИ: простой SQL, нет необходимости для добавления строк в таблицу
CONS: двойной запрос, который может получить снег на большой стол
2.Creat уникальный индекс на поле и использования:
INSERT INTO filetable (name, parent_id, path_num, path_string)
VALUES ('$name','$pid','$path_num','$path_string')
ON DUPLICATE KEY UPDATE 0=0;
и в PHP:
if (mysql_affected_rows() === 2) takeAction($name); // Yes 2 for updates
PROS: UPDATE срабатывает на небольшой фракции запросов, когда name
дублируется
CONS: дополнительный ряд в таблице
Уникальное поле является path_string, полный путь к файлу. В моей файловой системе это может быть очень длинным, поэтому поле типа TEXT. В MySQL нельзя создать уникальный индекс в поле TEXT. Так что я собираюсь создать колонку
`problemsolver` varchar(62) = $parent_id . '_'.$name
и уникальный уникальный указатель на нем.
Я ожидаю, что эти запросы составят 10% всех запросов к базе данных.
Вопрос: какой из этих двух методов вы бы использовали и почему? Или какие-либо лучшие варианты?
Как насчет индекса UNIQUE s.t. ваш INSERT просто провалится, а затем вы проверите результат? –
Я бы сказал, добавьте ключ UNIQUE к уникальным полям, затем используйте 'INSERT IGNORE' - сохраняет долю секунды' INSERT ... ON DUPLICATE', и вы на самом деле не ищете ошибки, не ради повторного выполнения запроса, по крайней мере). Также уместно: http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update – DACrosby