2013-09-06 2 views
0

Я пытаюсь найти наиболее эффективный код для поиска дубликатов имен файлов в родительской папке. Я хранения дерева файлов в базе данных 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% всех запросов к базе данных.

Вопрос: какой из этих двух методов вы бы использовали и почему? Или какие-либо лучшие варианты?

+0

Как насчет индекса UNIQUE s.t. ваш INSERT просто провалится, а затем вы проверите результат? –

+0

Я бы сказал, добавьте ключ UNIQUE к уникальным полям, затем используйте 'INSERT IGNORE' - сохраняет долю секунды' INSERT ... ON DUPLICATE', и вы на самом деле не ищете ошибки, не ради повторного выполнения запроса, по крайней мере). Также уместно: http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update – DACrosby

ответ

1

Оба метода будут работать. Метод 1 не идеален, потому что ваш запрос более интенсивный, и он выполняется каждый раз, когда, как вы сказали, не требуется каждый раз.

Метод два предпочтительнее, потому что при необходимости вы выполняете дополнительную работу, и это более эффективно.

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