powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Что быстрее, SUBSTRING_INDEX или несколько запросов
2 сообщений из 2, страница 1 из 1
Что быстрее, SUBSTRING_INDEX или несколько запросов
    #33217607
needful
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. В таблице node хранится дерево объектов. Структура такая
Id, ParentId, Path, Level. Индекс создан по полю Id. В поле Path хранится полный путь до данного объекта в виде всех его ParentId, разделённых запятыми, пример:

Id--ParentId--Path---Level
1-|-0-----------|-0-------|---1
2-|-1-----------|-0,1----|---2
3-|-2-----------|-0,1,2-|---3
...........................

(в этом примере есть запись 1, у которой дочерняя запись 2, у которой в свою очередь дочерняя запись 3).

Для того чтобы отрисовать дерево объектов (не обязательно от корня, а от любой записи, например все дочерние записи Id='1') можно пойти двумя путями:

1) Рекурсивно запрашивать дочерние объекты начиная с нужного Id, например с 1 (SELECT * FROM node WHERE ParentId='1', SELECT * FROM node WHERE ParentId='2' и т. д.)

2) Сделать один запрос используя функцию SUBSTRING_INDEX для поля Path примерно так:
(SUBSTRING_INDEX разбивает строку по разделителям и возвращает то, что находится до или после N-го разделителя, то есть мне нужно получить то что находится после N-й запятой в поле Path)

SELECT * FROM node WHERE ParentId='1' OR SUBSTRING_INDEX(Path, ",", Level)='1'...
Смысл в том, чтобы получить одним запросом иерархию объектов, критерием для выборки которой будет либо ParentId='1', либо N-я позиция в поле Path равная '1', где N будет равняться полю Level главной (корневой записи), от которой мы начинаем запрос, в данном случае это запись с Id=1 и Level=1

Параметры для запросов (ParentId и Level) будут задаваться в PHP-скрипте динамически.

У меня нет возможности протестировать оба способа на достаточно больших объёмах данных (среднего размера сайт, с форумом), меня интересует что теоретически будет быстрее работать -- 2,3 запроса, рекурсивно делаемых из PHP-скрипта или сформировать один такой запрос с SUBSTRING_INDEX и получить все данные сразу. Надеюсь не слишком утомил, всем спасибо большое заранее.

P.S.
Цели для этого изврата две. Либо отрисовывать всё дерево целиком, чтобы показать структуру сайта, либо в некоторых местах выводить "части дерева", например текущее сообщение форума с ответами в виде иерархии (дерева).

Быть может мне НЕ стоит использовать для этих целей один способ?
...
Рейтинг: 0 / 0
Что быстрее, SUBSTRING_INDEX или несколько запросов
    #33234032
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекурсией в запросах и не пахнет.

Можно использовать функцию

FIND_IN_SET(str,strlist)

Returns a value 1 to N if the string str is in the string list strlist consisting of N substrings. A string list is a string composed of substrings separated by ‘,’ characters. If the first argument is a constant string and the second is a column of type SET, the FIND_IN_SET() function is optimized to use bit arithmetic. Returns 0 if str is not in strlist or if strlist is the empty string. Returns NULL if either argument is NULL. This function does not work properly if the first argument contains a comma (‘,’) character.

mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Что быстрее, SUBSTRING_INDEX или несколько запросов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]