|
|
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Данные: В базе данных есть несколько таблиц материалов с одинаковыми полями. Пример: новости(news), статьи(articles), достопримечательности(attractions) и т. д. У всех них есть id, title, text Некоторые типы материалов имеют точку на карте. Для хранения координат используется другая таблица, где кроме данных карты указаны mat_id и mat_type, где mat_type - тип материала, который совпадает с именем таблицы. Сейчас для получения всех точек на карте используется основной запрос, который выбирает все данные из таблицы карты. Потом куча запросов - по каждой строке выбираются данные материала из соответствующей таблицы материала. Вопрос: Можно ли оптимизировать выборку одним запросом? Вариант с изменением структуры БД не подходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 11:29:24 |
|
||
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
ScareCrow, Спасибо ))) Подтолкните пожалуйста в каком направлении двигаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 12:28:34 |
|
||
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Можно в один запрос включить джойны на все таблицы материалов типа: Код: sql 1. 2. 3. 4. Этот запрос для каждой строки из карты будет искать соответствие в связанных таблицах. Если в какой-либо таблице соответствие не будет найдено, то нужное поле этой таблицы будет иметь значение NULL. Функция coalesce выдаст значение поля только из той таблицы, где было найдено соответствие типа и ид. Ну, или NULL, если такого соответствия не было найдено ни в одной таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 13:29:25 |
|
||
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
webzilla Вариант с изменением структуры БД не подходитОдин из стандартных подходов - использование [UNION-]вьюва в качестве объединяющей/унифицирующей прокладки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 13:31:18 |
|
||
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
OlegROA, Спасибо. Думал в этом направлении, но при необходимости последующих доработок внесение дополнительной таблицы повлечет изменение кода, что нарушит гибкость. Вот если бы можно было сделать что-то наподобие select mat_id, mat_type as tablename from map а дальше в запросе использовать tablename как переменную для обращения к соответствующей таблице и выбирать id, title напишу ерунду, но может это объяснит в каком направлении я думаю select id, title, map.mat_type as tablename from map left join tablename on mat_id = id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 13:55:38 |
|
||
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Akina подсказал уже, как сделать гибкое решение - делаете VIEW-представление, в которое из всех нужных таблиц будут собираться записи. И в основном запросе будете использовать выборку только из этого VIEW-представления по уникальному коду материала. При изменении/добавлении/удалении таблиц материалов прийдется редактировать только это VIEW-представление. Основная здесь проблема - как сделать все идентификаторы из всех таблиц материалов уникальными. Исходя из задачи выход только один - конструировать уникальный идентификатор из типа материала и внутреннего идентификатора материала в своей таблице. Есть два варианта - каждой таблице назначить свой диапазон значений идентификаторов. К примеру, дать на каждую таблицу по 100млн. записей. В этом случае уникальный идентификатор формируется как: Код: sql 1. Второй вариант - использовать символьный идентификатор, который формируется из префикса - название типа материала и ид этого материала: Код: sql 1. Т.е., сами таблицы материалов мы не трогаем, но во VIEW-представление "собираем" новую таблицу из нужных колонок и формируем уникальный идентифкатор материала по одному из вышеприведенному варианту. Соответственно, выборку из карты делаем только с джойном по VIEW-представлению, подставляя в условие выборки ON поиск по сформированному идентификатору: Код: sql 1. 2. или Код: sql 1. 2. Выборка для формирования самого VIEW-представления будет примерно такой: Код: sql 1. 2. 3. 4. 5. 6. или Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 15:01:20 |
|
||
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
OlegROA, Большое спасибо. Извините за некомпетентность в моем следующем вопросе, но просветите пожалуйста. Каким образом формируется VIEW. Чтобы выдать результат при запросе ко VIEW сначала запускается запрос, который формирует этот VIEW а затем выбирает данные из VIEW соответственно запросу или формируется VIEW а затем отлеживается изменение таблиц "входящих" в запрос формирования VIEW и обновляется? Или другое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 15:46:10 |
|
||
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
webzilla, http://sqlinfo.ru/articles/info/9.html Существует два алгоритма, используемых MySQL при обращении к представлению: MERGE и TEMPTABLE. В случае алгоритма MERGE, MySQL при обращении к представлению добавляет в использующийся оператор соответствующие части из определения представления и выполняет получившийся оператор. В случае алгоритма TEMPTABLE, MySQL заносит содержимое представления во временную таблицу, над которой затем выполняется оператор обращенный к представлению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2014, 16:05:26 |
|
||
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
webzillaКаким образом формируется VIEW.Ответ в виде ссылки на статью уже дали. Я лишь добавлю, что можно воспринимать VIEW как некую таблицу, в которой реально нет данных. Т.е., создаем в базе VIEW и пишем в ней запрос на выборку данных из других таблиц. После сохранения эта VIEW будет храниться в базе как и прочие таблицы. При обращении к этой VIEW Код: sql 1. автоматически запускается тот запрос, который прописан в свойствах этой VIEW и мы получаем результат такой двойной выборки. Удобно в случаях типа Вашего - когда структуру базы менять нельзя или нужен достаточно сложный запрос, который будет использоваться часто в разных местах пользовательского приложения - вместо дублирования этого запроса просто ставим вызов нужной VIEW. В последнем случае выигрышь еще и в том, что если нужно будет изменить запрос (изменились таблицы или изменилось условие), то не прийдется его менять в самой клиентской программе - просто изменим его в свойствах VIEW в базе! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 01:12:28 |
|
||
|
Оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
webzillaOlegROA, Спасибо. Думал в этом направлении, ... ты бы лучше подумал в направлении "а не прислать бы мне код запроса в этот замечательный форум на sql. ru". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2014, 07:10:07 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38537046&tid=1835343]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 325ms |

| 0 / 0 |
