gzhegow
@gzhegow
aka "ОбнимиБизнесмена"

Как построить Closure Table для целой таблицы одним рекурсивным запросом или как правильно это делать для большого числа записей?

category
// id, parent_id, slug, path
1, null, category-a1, category-a1
2, 1, category-b1, category-a1/category-b1
3, 2, category-c1, category-a1/category-b1/category-c1


category_closure
// parent_id, child_id, depth
// ?
// example:
// null, null, 0
// 1, 1, 0
// null, 1, 1
// 2, 2, 0
// 1, 2, 1
// null, 2, 2
// 3,3,0
// 2,3,1
// 1,3,2
// null,3,3


Есть на percona.com код, который строит closure для текущей записи, с потомками. Работает как часы, проверено.

Но когда вставляем например пару тысяч категорий, даже цепочками от первого уровня до последнего - вставка занимает буквально секунды, т.к. отталкивается от прошлой записи и делает сначала отвязку от текущего parent, потом привязку этого вместе со всеми потомками к новому. Если по одной записи - то моментально, но когда пишем в базу 70000 тысяч подряд одновременно постоянно достраивая и удаляя отталкиваясь inner join от того что было - всё, гэга.

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

Уверен что это будет в сотни раз быстрее, с другой стороны все равно ведь придется обойти КАЖДУЮ запись.
  • Вопрос задан
  • 47 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы