|
|
|
Что быстрее, SUBSTRING_INDEX или несколько запросов
|
|||
|---|---|---|---|
|
#18+
Всем привет. В таблице 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. Цели для этого изврата две. Либо отрисовывать всё дерево целиком, чтобы показать структуру сайта, либо в некоторых местах выводить "части дерева", например текущее сообщение форума с ответами в виде иерархии (дерева). Быть может мне НЕ стоит использовать для этих целей один способ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 12:23:50 |
|
||
|
Что быстрее, SUBSTRING_INDEX или несколько запросов
|
|||
|---|---|---|---|
|
#18+
Рекурсией в запросах и не пахнет. Можно использовать функцию 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2005, 13:23:25 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=651&tid=1853748]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 264ms |
| total: | 423ms |

| 0 / 0 |
