[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизировать запрос
md5
Кто бы и как оптимизировал?<br><br>
 
    $psql = $mysql -> Query ("SELECT O.`id`, P.`value` AS `name`, P2.`value` AS `price`, P3.`value` AS `img`, P4.`value` AS `content_s`
                              FROM `".$config -> table['objects']."` AS O
                              JOIN `".$config -> table['property_values']."` AS P
                              ON O.`id`=P.`obj_id`
                              JOIN `".$config -> table['property_list']."` AS L
                              ON P.`list_id`=L.`id`
                              JOIN `".$config -> table['property_values']."` AS P2
                              ON O.`id`=P2.`obj_id`
                              JOIN `".$config -> table['property_list']."` AS L2
                              ON P2.`list_id`=L2.`id`
                              JOIN `".$config -> table['property_values']."` AS P3
                              ON O.`id`=P3.`obj_id`
                              JOIN `".$config -> table['property_list']."` AS L3
                              ON P3.`list_id`=L3.`id`
                              JOIN `".$config -> table['property_values']."` AS P4
                              ON O.`id`=P4.`obj_id`
                              JOIN `".$config -> table['property_list']."` AS L4
                              ON P4.`list_id`=L4.`id`
                              JOIN `".$config -> table['catalog_copula']."` AS CC
                              ON CC.`obj_id`=O.`id`
                              WHERE CC.`car_id`='".$varsGet['car']."' AND L.`system_name`='obj_name' AND L2.`system_name`='obj_price' AND L3.`system_name`='obj_preview' AND L4.`system_name`='obj_content_s'
                              GROUP BY O.`id`
                              ORDER BY P.`value` ASC
                              LIMIT ".$gstart.", ".$gend)
                              or die ($mysql -> Error("",__FILE__,__LINE__,mysql_error()));
 


из-за этого запроса у моего клиента, отключили базу хостеры!



Спустя 30 минут, 39 секунд (12.12.2006 - 16:03) vasa_c написал(а):
Чего он хотя бы делает. И сам запрос покажи, а не php

Спустя 1 минута, 42 секунды (12.12.2006 - 16:04) zilogo написал(а):
Сколько длится запрос и что эксплайн показывает ?

Спустя 12 минут, 41 секунда (12.12.2006 - 16:17) AlexBB написал(а):
Запрос ниасилил ... слишком много букв. :)
Ошибка в консерватории ...

Спустя 1 час, 11 минут, 54 секунды (12.12.2006 - 17:29) md5 написал(а):
Короче есть таблица с товарами, $config -> TABLE['objects'].<br>там поля: id, parent_id, module_id<br>Есть таблица(property_list), где хранятся названия атрибутов товара (цена, картинка, описалово) (id, name)<br>Есть отдельно таблица(property_values) где хранятся значения этих атрибутов (id, obj_id, List_id):<br><br>т.е. чтобы нам вытащить цену для объекта с id=9 мы делаем запрос:<br><br>
SELECT P.`value`
FROM `".$config -> table['property_values']."` AS P
JOIN `".$config -> table['property_list']."` AS L
ON P.`list_id`=L.`id`
WHERE L.`name`='цена нафек' AND P.`obj_id`=9


пожалуйста, не пишите "ниасили" и т.д.

Спустя 10 минут, 45 секунд (12.12.2006 - 17:40) md5 написал(а):
QUOTE
Чего он хотя бы делает.

Вытаскивает товар из objects и его атрибуты: название, цена, описалово и картинку.

QUOTE
Сколько длится запрос и что эксплайн показывает ?

Запрос неизмерим, хостер вырубил базу и сказал оптимизируйте скрипт (mchost.ru), пробовал на мастерхосте, все волшебно быстро загружается...

Спустя 15 минут, 9 секунд (12.12.2006 - 17:55) zilogo написал(а):
QUOTE
все волшебно быстро загружается

Т.е. одно и тоже у разных хостеров работает быстро и медленно ?

Думаю на форуме бесполезно такое спрашивать, ибо нужно смотреть и базы и запросы, где какие индексы и как проходит эксплайн. Можно попробовать использовать myisamchk.

Спустя 3 минуты, 51 секунда (12.12.2006 - 17:59) md5 написал(а):
QUOTE
быстро и медленно

нет, работает и вобще не работает, при этом хостеры страшно пугаются и вырубают базу..

QUOTE
Можно попробовать использовать myisamchk.

спасибо

Спустя 39 минут, 17 секунд (12.12.2006 - 18:38) AlexBB написал(а):
При такой структуре базы, думаю не надо пытаться все обязательно впихнуть в один запрос.

Спустя 22 минуты, 9 секунд (12.12.2006 - 19:00) md5 написал(а):
AlexBB,
а как бы ты это сделал??

Спустя 4 часа, 12 минут, 52 секунды (12.12.2006 - 23:13) Ghost написал(а):
вообще думаю что повис не SQL... может запрос в цикле каком стоял?

и еще такой момент.. неясно, нафиг те ваще делать join по таблице с именами свойств.., ты же не делаешь по ним выборку - сделай отбор по id, дкмаю там однозначное соответствие с "system_name". А если нет, то сделай запросы, отбирающие id, и условия
WHERE P.`list_id`in... AND P2...

Спустя 10 часов, 7 минут, 45 секунд (13.12.2006 - 09:21) md5 написал(а):
QUOTE
может запрос в цикле каком стоял?

цикла нет, я говорю про нагрузку на базу, которую создал этот запрос

join для того чтобы вытащить атрибут товара, по его id..

у меня просто сомнения, нельзя ли заменить JOIN как-то, я ведь к одной и тойже таблице обращаюсь 4 раза, присваивая им разные алиасы..

Спустя 1 час, 8 минут, 22 секунды (13.12.2006 - 10:29) Ghost написал(а):
md5,
дык дело в том, что наименование атрибута ты не используешь, у тебя Join посути исполняет роль WHERE

Спустя 3 минуты, 3 секунды (13.12.2006 - 10:32) Ghost написал(а):
опиши класс переменной $config, может и полуится чего оптимизировать
и если не трудно, скинь пример текста запроса, без пхп-переменных, т.е с их значениями..
а то грызут меня смутные сомнения..

Спустя 36 минут, 45 секунд (13.12.2006 - 11:09) md5 написал(а):
QUOTE
дык дело в том, что наименование атрибута ты не используешь, у тебя Join посути исполняет роль WHERE

это правильно, тут у меня тоже сомнения :/

QUOTE
опиши класс переменной $config

зачем? в данном случаем используются переменные, в которых хранятся имена таблиц в БД

Спустя 2 часа, 2 минуты, 55 секунд (13.12.2006 - 13:12) AlexBB написал(а):
QUOTE(md5)
AlexBB,
а как бы ты это сделал??

Да я бы просто извлек бы характеристики товара
Select P.Name, V.Value FROM property_list P, property_values V WHERE V.obj_id=9 AND V.List_id=P.id
и прошелся бы потом по ним циклом

И ни в коем случае никаких
L.`name`='цена нафек'
работаем тока с идишниками

Спустя 1 час, 55 минут, 10 секунд (13.12.2006 - 15:07) Ghost написал(а):
если 5-й mysql можно попробовать заюзать хранимые процедуры
есть мнение, что они сильно облегчают жизнь приложениям

Спустя 1 минута, 55 секунд (13.12.2006 - 15:09) md5 написал(а):
AlexBB,
я понимаю, что работаем только с id шниками, я с ними и работаю, только в данном случае id характеристики мы узнаем из её имени (допустим 'obj_price'), но это только название характеристики, чтобы получить её значение для этого объекта мы обращаемся к таблице
property_values AS P
JOIN property_list AS L
ON P.`list_id`=L.`id`
WHERE L.`name`='obj_price' AND P.`obj_id`='my_object_id'
//вытаскием id характеристики (L.`id`) по его имени (т.к. не знаю его id)
//и вытаскиваем P.`value` (значение характеристики) по связке L.`id`=P.`list_id`


QUOTE
Select P.Name, V.Value FROM property_list P, property_values V WHERE V.obj_id=9 AND V.List_id=P.id

дело в том, что мне P.name вобще не нужно, я использую его только лишь для того чтобы узнать id характеристики по этому же самому P.name и сделать связку V.`list_id`=P.`id`

с твоим запросом ща поэкспериментирую..

Спустя 1 минута, 53 секунды (13.12.2006 - 15:11) AlexBB написал(а):
QUOTE(Ghost)
если 5-й mysql можно попробовать заюзать хранимые процедуры
есть мнение, что они сильно облегчают жизнь приложениям

И чем она в данном случае облегчит жизнь?
Ну будет делать то же самое что я написал не пхп, а хранимая процедура ...
Само по себе это конечно не плохо, но к сути вопроса отношения не имеет.

Спустя 6 минут, 7 секунд (13.12.2006 - 15:17) md5 написал(а):
QUOTE
если 5-й mysql

4

Спустя 10 минут, 44 секунды (13.12.2006 - 15:28) AlexBB написал(а):
QUOTE(md5)
AlexBB,
я понимаю, что работаем только с id шниками, я с ними и работаю, только в данном случае id характеристики мы узнаем из её имени

Думаю стоит пересмотреть архитектуру приложения, чтоб такого не было. Откуда изначально берется имя характеристики?

Спустя 1 минута, 1 секунда (13.12.2006 - 15:29) md5 написал(а):
QUOTE
если 5-й mysql

4

Спустя 2 минуты, 34 секунды (13.12.2006 - 15:31) md5 написал(а):
AlexBB,
Названия характеристик - property_list
структура:
id, name, type

Значения характеристик - property_values
структура:
id, list_id, obj_id, value

Спустя 36 секунд (13.12.2006 - 15:32) Ghost написал(а):
AlexBB,
хранимые процедуры были созданы именно для оптимизации насколько я помню
в любом случае на 4-м их нет
и все-таки хотелось бы увидеть текст вопроса зс значениями $config -> table['property_list']

поясню причину: мне непонятно, у тебя $config -> table['property_list'] юзается 4 раза, в запросе..
это одно и то же значение или разные?

если одно и то же, то столько джоинов не нужно естессна

Спустя 3 минуты, 2 секунды (13.12.2006 - 15:35) AlexBB написал(а):
md5, Да структуру я понял. Проблема-то в чем?
Откуда в скрипте берется имя? Его кто-то вводит или что?

Спустя 4 минуты, 40 секунд (13.12.2006 - 15:40) md5 написал(а):
я говорю скрипту вытащить значение характеристики obj_price
тоесть по-русски - вытащить цену товара

проблем нет, прочитай изначальный вопрос, я спрашиваю, можно ли как-то оптимизировать его?

Как видишь из запроса - JOIN 'нются одни и теже таблицы 4 раза (разные характеристики: цена, фотка, описалово и т.д.)
у меня сомнения по поводу этой структуры запроса, нельзя ли как-нибудь его оптимизировать?

Спустя 1 минута, 30 секунд (13.12.2006 - 15:41) md5 написал(а):
Ghost,
в таком случае, он вытащит все характеристики по этому объекту, а мне нужно только те, которые я перечислил

Спустя 45 секунд (13.12.2006 - 15:42) md5 написал(а):
QUOTE
AND L.`system_name`='obj_name'
AND L2.`system_name`='obj_price'
AND L3.`system_name`='obj_preview'
AND L4.`system_name`='obj_content_s'

а где таблицы L2, L3, L4???

Спустя 2 минуты, 32 секунды (13.12.2006 - 15:44) Ghost написал(а):
ой, блин, я тормоз, уберу пока никто не увидел..
тогда тока так
QUOTE
делай отбор по id, дкмаю там однозначное соответствие с "system_name". А если нет, то сделай запросы, отбирающие id, и условия
WHERE P.`list_id`in... AND P2...

я других вариантов не вижу

это позволит от лишних join-ов избавится

Спустя 9 секунд (13.12.2006 - 15:45) AlexBB написал(а):
Я уже написал, что не надо его оптимизировать. Надо сделать другую логику. И даже написал как.
И я так и не понял, накой нужно поле name, если у характеристики есть id.

Спустя 10 минут (13.12.2006 - 15:55) md5 написал(а):
AlexBB,
спасибо за предложенный вариант логики,
короче надо вытащить все характеристики (что уберет почти все JOIN), а потом отобрать те, что нужны мне...

просто тут ещё такой момент, если какой-то характеристики не хватает, то её не хочу выводить..
в моем запросе - это сразу отсекается..

ну да ладно, все спасибо

Спустя 40 минут, 54 секунды (13.12.2006 - 16:35) AlexBB написал(а):
QUOTE(md5)
AlexBB,
спасибо за предложенный вариант логики,
короче надо вытащить все характеристики (что уберет почти все JOIN), а потом отобрать те, что нужны мне...

Да собственно и в сам запрос можно добавить ограничивающие условия AND P.Name IN (те которые надо)

QUOTE
просто тут ещё такой момент, если какой-то характеристики не хватает, то её не хочу выводить..
в моем запросе - это сразу отсекается..

Ну дык и здесь ее не будет. Наоборот, если надо вытаскивать все даже те у которых нет значения, тогда можно переделать мой запрос на LEFT JOIN

Спустя 16 минут, 3 секунды (13.12.2006 - 16:51) md5 написал(а):
QUOTE
её не хочу выводить

её - имеется ввиду товар =)
если какой-нить хар-ки нет - не выводить товар
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.