Professor
Новичок
Добрый день.
Необходимо осуществлять поиск по городу и выводить полное дерево до него от области до города
Пример: Для города Железногорск нужно вывести:
Курская обл. Железногорский район, г Железногорск
Для поиска используются общедоступный кладры.
Единственное, я привел их в структуру Nested Sets, для более удобной работы.
Соответственно для поиска использую такой запрос:
То есть ищу все города начинающиеся на "Железн"
Достаю их кладры и осуществляю поиск
Explain
Индексы стоят на left и right (вообще, на время тестов поставил индексы на все, на что можно)
Пробовал ограничить выборку таким образом
kladr_top - это первые 2 цифры кладра. То есть поиск только по нужному региону + найденные кладры всегда меньше кладра города, так ка ветвь идет вверх.
Индексы поставил опять же на все. Ситуация стала лучше, но все равно фиговая.
Подскажите, как оптимизировать этот запрос.
Необходимо осуществлять поиск по городу и выводить полное дерево до него от области до города
Пример: Для города Железногорск нужно вывести:
Курская обл. Железногорский район, г Железногорск
Для поиска используются общедоступный кладры.
Единственное, я привел их в структуру Nested Sets, для более удобной работы.
Соответственно для поиска использую такой запрос:
Код:
SELECT * FROM core.delivery_kladr WHERE title LIKE "Железн%" AND `socr` IN ("г")
Достаю их кладры и осуществляю поиск
Код:
SELECT
`kladr`.`kladr` AS `key`, `kladr2` . *
FROM
`delivery_kladr` AS `kladr`
INNER JOIN
`delivery_kladr` AS `kladr2` ON
kladr2.lft <= kladr.lft AND kladr2.rgt >= kladr.rgt
WHERE
(kladr.kladr IN ('5000000400000','4600700100000','7200100000600'))
Код:
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'kladr', 'range', 'PRIMARY,r,l', 'PRIMARY', '39', NULL, '3', 'Using where'
'1', 'SIMPLE', 'kladr2', 'ALL', 'r,l', NULL, NULL, NULL, '205373', 'Range checked for each record (index map: 0x18)'
Пробовал ограничить выборку таким образом
Код:
SELECT
`kladr`.`kladr` AS `key`, `kladr2` . *
FROM
`delivery_kladr` AS `kladr`
INNER JOIN
`delivery_kladr` AS `kladr2` ON
kladr2.lft <= kladr.lft AND kladr2.rgt >= kladr.rgt AND
kladr2.kladr_top IN ('50', '46', '72') AND
`kladr2`.kladr<=`kladr`.kladr
WHERE
(kladr.kladr IN ('5000000400000','4600700100000','7200100000600'))
Индексы поставил опять же на все. Ситуация стала лучше, но все равно фиговая.
Код:
1, SIMPLE, kladr2, range, PRIMARY,r,l, index7, 9, , 28404, Range checked for each record (index map: 0x19)
Подскажите, как оптимизировать этот запрос.